2014年7月24日木曜日

InitialContextを使ったディレクトリ操作のサンプル

EJBやRMIなどを利用しているとよく目にするInitialContext。公式ドキュメントを読んでいたら、どうやら、ファイルシステムもlookupしたりすることができるみたいです。

ファイルシステム以外にも、LDAPやDNSの検索ができたり、思ったよりも多機能な様子です。

そこで、指定したディレクトリ配下にあるファイルを出力するサンプルコードを書いてみました。
サブディレクトリがある場合は、その下を再帰的にほってファイル名を探しにいきます。




import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import java.util.Hashtable;
import com.sun.jndi.fscontext.RefFSContext;

class JNDIFileLookup {
 public static void main(String[] args) {

  String root = "file:/";
  Hashtable env = new Hashtable(11);
  env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.fscontext.RefFSContextFactory");
  env.put(Context.PROVIDER_URL, root);

  try {
   Context ctx = new InitialContext(env);
   listFiles(ctx);
  } catch (Exception e) {

  }
 }

 private static void listFiles(Context context) {
  NamingEnumeration list;
  try {
   list = context.list("");
   while (list.hasMore()) {
    NameClassPair nc = (NameClassPair) list.next();
    Object sub = context.lookup(nc.getName());

    if (sub instanceof RefFSContext) {
     listFiles((RefFSContext) sub);
    } else {
     System.out.println(sub);
    }

   }
  } catch (NamingException e1) {

   e1.printStackTrace();
  }

 }

}

なお、filesystem操作用のサービスプロバイダーは標準で用意されていないようで、fscontext.jarを落としてくる必要があります。

公式のドキュメントでもjarのリンクが張ってあったんですが、com.sunの下にリンクがはられており、リンク切れでたどり着くことができませんでした。

そのため、私はこちらからjarを落として使いました

参考文献



0 件のコメント:

コメントを投稿