Path.startsWith возвращает false для пути файла Windows в Linux

Почему это должно быть?

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]

Я запускаю Java 8 на Ubuntu, но ничего о javadocs для Path.startsWith не объясняет, почему это происходит. Ни путь файла не содержит никаких реальных файлов.

Ответ 1

Вам нужно проверить код, чтобы узнать, что происходит на самом деле. Поэтому, когда вы создаете функцию Path normalizeAndCheck. В вашем случае это называется sun.nio.fs.UnixPath. Так как разделитель путей для * nix - это /, строки пути будут нормализованы на /.

В случае путей Windows нет /, поэтому они будут оставаться одинаковыми, поэтому он сравнивает "C:\\foo" "C:\\foo\\bar\\baz.jpg", которые являются разными строками и, следовательно, не имеют общего префикса.

Ответ 2

Я думаю, что ниже строки из Java Docs java.nio.file.Path отвечает на ваш вопрос

Объект, который может использоваться для поиска файла в файловой системе. Это будет обычно представляют собой системный путь к файлу.

Ответ 3

Как описано в Javadocs, Java использует "разделитель путей" для определения символа разделителя пути текущей рабочей среды. Доступ к нему возможен через:

System.getProperty("path.separator");

в системе на базе UNIX это "/", а в системах Windows - "\". Если вы хотите изменить эти свойства, вы можете использовать следующее:

Properties p = System.getProperties();
p.put("path.separator", "\\");
System.setProperties(p);