java.io.Fileの。の<init>(ファイル、文字列)JDKのバージョンに依存

イワンカリーニン:

それはのように見えるのですjava.io.Fileの。(ファイル、文字列)に依存するJDKのバージョンです。コード例は、Windows 10上で実行されました。

コード例:

public static void main(String... args) {
    String path = "C:\\Workspace\\project";
    File file = null;
    for (String part : path.split("\\\\")) {
        file = new File(file, part);
    }
    System.out.println(file);
    // prints "C:Workspace\project" for JDK 9+
    // prints "C:\Workspace\project" for JDK 8
}

あなたはアドレスを喜ばせることができた場合のいずれかの既知の問題や解決策があります

davidxxx:

Javaの9では、WinNTFileSystemクラス(Windows用のファイルシステムの実装)を変更しました。
それはおそらくクラスは、絶対パスとは何かを考えて仕方の問題を解決します。私は、まさに、このいずれかを指定するバグを見つけられませんでしたが、一部は近くにあります。

File.isAbsolute() 状態:

そのプレフィックスが「\」、またはその接頭辞がある場合は、「\\」に続いて、ドライブ指定子がある場合、Microsoft Windowsシステムでは、パス名は絶対です。

仕様に従ってので、以下のために:

File x = new File("C:", "Workspace"); 
System.out.println(x.isAbsolute()); // not absolute according to the spec

File xx = new File("C:\\", "Workspace");
System.out.println(xx.isAbsolute());

File xxx = new File("\\\\Workspace");
System.out.println(xxx.isAbsolute());

私たちは期待する :

真真偽

しかし、我々が得ます:

真真真

Javaの9からは、期待される結果を生成します。

問題は、Java 9前せずにパスがあることを\、絶対パスとして考慮全て同じです。

File x = new File("C:", "Workspace");
System.out.println(x.isAbsolute()); // true

こうであるべきではないとしています。

具体的には、主な変更点は懸念resolve(String parent, String child)のメソッドWinNTFileSystemクラスを。
前に、resolve()スラッシュで始まっていない任意の子パスの親と子の間にスラッシュを追加することによって抽象パスを解決しました。
Javaの9からは、resolve()親がドライブであれば、親と子の間でもはやスラッシュを追加しません。

ここでの変更は

boolean isDirectoryRelative =
    pn == 2 && isLetter(parent.charAt(0)) && parent.charAt(1) == ':';

if (child.charAt(childStart) == slash || isDirectoryRelative) {
    theChars = new char[strlen];             ^-------- this one was added from Java 9
    parent.getChars(0, parentEnd, theChars, 0);
    child.getChars(childStart, cn, theChars, parentEnd);
} else {
    theChars = new char[strlen + 1];
    parent.getChars(0, parentEnd, theChars, 0);
    theChars[parentEnd] = slash;
    child.getChars(childStart, cn, theChars, parentEnd + 1);
}

結果

あなたの質問について:

あなたはアドレスを喜ばせることができた場合のいずれかの既知の問題や解決策があります

2つのJDKのバージョンの問題との違い。それは抽象パス名の正規化されたパス名(の値の両方に関するFile.getPath())絶対パスの値は、File.getAbsolutePath()今のようにnew File("C:", "Workspace")相対パスを生成します。

あなたのアプリケーションが依存している場合はFile.getPath()その上で、いくつかの解析を行うには、それが明確な行動を持っており、いくつかの問題を作成することができます。
JDKのバージョン間で移植可能なコードを持っているために、解決されたパス上の任意の解析は、オプションとして考慮すべきである\だけで、Windowsのドライブの後。
このようにC:\してC:同じように処理されます。

アプリケーションが依存している場合File.getAbsolutePath()(絶対パスとして、これはちょうど自分自身を返す前)今の相対パスがファイルシステムに対して解決されるように、それはまた、Java 9からいくつかの驚きを持つことができます。
ので、代わりに、あなたはとてもおそらく使用する必要がありFile.getPath()、ファイルシステムに対するパスを解決しないように。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=138123&siteId=1