ファイルシステム以外にも、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を落として使いました。
参考文献