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