2016-04-11 12 views
4

これはなぜでしょうか?Path.startsWithは、Linux上のWindowsファイルパスに対してfalseを返します

Path parent1 = Paths.get("/flugel/borf/noggin"); 
Path child1 = Paths.get("/flugel/borf/noggin/foo/bar/baz.jpg"); 
System.out.println("child1 startsWith parent1? " + child1.startsWith(parent1)); 
System.out.println(child1.getFileSystem()); 
System.out.println(parent1.getFileSystem()); 

Path parent2 = Paths.get("C:\\foo"); 
Path child2 = Paths.get("C:\\foo\\bar\\baz.jpg"); 
System.out.println("child2 startsWith parent2? " + child2.startsWith(parent2)); 
System.out.println(child2.getFileSystem()); 
System.out.println(parent2.getFileSystem()); 

戻り

child1 startsWith parent1? true 
[email protected] 
[email protected] 
child2 startsWith parent2? false 
[email protected] 
[email protected] 

私はUbuntuの上でJava 8を実行しているんだけど、これが発生する理由Path.startsWithのjavadocについては何も説明しません。いずれのファイルパスも実際のファイルを含んでいません。私はjava.nio.file.PathのJavaのドキュメントからライン以下だと思い

答えて

1

実際に何が起こっているかを確認するには、コードをチェックする必要があります。したがって、パスを作成するときはnormalizeAndCheck関数が呼び出されます。あなたの場合、これはsun.nio.fs.UnixPathで呼び出されます。 * nixのパス区切り文字は/なので、パス文字列は/で正規化されます。

Windowsパスの場合は、/が存在しないため、まったく同じになるので、異なる文字列で共通の接頭辞ではない"C:\\foo""C:\\foo\\bar\\baz.jpg"を比較します。

+0

私はこの種のことが起こっていると考えましたが、それでも何とか驚くような気がします。 – ben3000

+0

関連するソースコードへのリンクをありがとう、私は間違ったセクションをステップ実行しようとしたため、これに気付かなかった。いい答えだ。 – ben3000

+0

素晴らしい!答えに投票してください:-) – user987339

1

は、あなたの質問

ファイルシステム内のファイルを検索するために使用することができるオブジェクトを応答します。 は、通常、システムに依存するファイルパスを表します。

+0

をうーん、私はそのビットを脱脂読み持っている必要があります、私は次の文章に焦点を当て:「指定されたパスが異なるに関連付けられている場合FileSystemをこのパスに設定すると、falseが返されます。私のコードはうまくいくはずです。 – ben3000

0

Javadocsで説明されているように、Javaは「パス区切り」を使用して、現在のオペレーティング環境のパス区切り文字を判別します。これは、次の方法でアクセスできます。

System.getProperty("path.separator"); 

UNIXベースのシステムでは「/」ですが、Windowsシステムでは「\」です。あなたはそれを達成するために、以下を使用することができ、これらのプロパティを変更する場合:

Properties p = System.getProperties(); 
p.put("path.separator", "\\"); 
System.setProperties(p); 
関連する問題