Присоединение nio.path к Paths.get () или Path.resolve () - PullRequest
0 голосов
/ 23 февраля 2019

Интересно, в чем разница между использованием Paths.get () и Path.resolve, как в этом примере:

public static void main(String[] args) {
    Path p1 = Paths.get("dir1","dir2","file.jpg");
    Path p2 = Paths.get("").resolve("dir1/dir2/file.jpg");

    System.out.println(p1.toString()); // yields: dir1/dir2/file.jpg
    System.out.println(p2.toString()); // yields: dir1/dir2/file.jpg
}

Похоже, что оба ведут себя одинаково, но в приложении Java EE я наблюдал, чтоp1 получил домашний каталог, назначенный в качестве префикса.Я нашел ответ @Aleksandr Dubinsky на этот вопрос StackOverflow Как объединить пути в Java? , но я не понимаю смысла процитированного javadoc:

Обратите внимание, что Paths.get () (как это было предложено кем-то другим) не имеет перегрузки, принимающей Path, и выполнение Paths.get (path.toString (), childPath) является NOT тем же, что и resol ().Из документа Paths.get ():

Обратите внимание, что хотя этот метод очень удобен, его использование подразумевает предполагаемую ссылку на файловую систему по умолчанию и ограничивает полезность вызывающего кода.Следовательно, он не должен использоваться в коде библиотеки, предназначенном для гибкого повторного использования.Более гибкой альтернативой является использование существующего экземпляра Path в качестве привязки, такого как:

Path dir = ...
Path path = dir.resolve("file");

В частности, я не понимаю, что javadoc хочет сказать "будет означать"предполагаемая ссылка на файловую систему по умолчанию. "

1 Ответ

0 голосов
/ 23 февраля 2019

Paths.get(...) в некотором смысле работает как функция os.path.join(...) в Python, просто соединяя части пути, используя соответствующий разделитель файлов.Метод resolve имеет некоторую внутреннюю логику и предположения относительно аргументов.Использование фактической файловой системы означает, что этот метод, например, проверит, является ли аргумент абсолютным путем.Метод resolve в общем случае будет использовать определенную файловую систему, тогда как get будет поддерживаться «файловой системой по умолчанию».

Сравнение:

jshell> Paths.get("one", "/two")
$6 ==> one/two
jshell> Paths.get("one").resolve("/two")
$7 ==> /two 
...