Java : java.io.File

[id:lethevert:20060908:p3]の続き
File#getCanonicalPath()を取ってみたら、意図しているディレクトリより上のディレクトリを指していることが判明。
調査続行。

      • -

クラスライブラリを直接確認する方が早そうだと、JODEでFileクラスの実装を確認しようとしたら、NoClassDefFoundErrorが・・・

      • -

よく考えたら、jdk1.5は、ソースつきでインストールしていたので、展開して確認。とりあえず、これを書いた人は8タブ派であることを確認。

      • -

やはり、JNIで書かれていて、実装の詳細は確認できず。概要は、getCanonicalPath()は、getAbsolutePath()をcanonicalizeして得ているようだ。canonicalizeの動作の詳細は、FileSystemクラスで定義されていて、これがプラットフォームごとにサブクラスが定義されていて、その部分がJNIで実装されているという具合。

      • -

なぜかよく分からないけれど、

      File f = new File(currdir, String.valueOf(p));

と書く代わりに

    File f;
    try{
      f = new File(currdir.getCanonicalPath(),String.valueOf(p));
    }catch(IOException _){
      f = new File(currdir, String.valueOf(p));
    }

と書くことで、現象を回避。やっぱりバグくさいなぁ。

      • -

完全解明しました。
http://lethevert.blogspot.com/2006/09/strange-behaviour-of-javaiofile.html