В Python
склеить два пути с os.path.join
:
os.path.join("foo", "bar") # => "foo/bar"
Я пытаюсь добиться того же на Java, не беспокоясь о том, OS
есть ли Unix
, Solaris
или Windows
:
public static void main(String[] args) {
Path currentRelativePath = Paths.get("");
String current_dir = currentRelativePath.toAbsolutePath().toString();
String filename = "data/foo.txt";
Path filepath = currentRelativePath.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
}
Я ожидал, что Path.resolve( )
это присоединится к моему текущему каталогу /home/user/test
с data/foo.txt
файлом make /home/user/test/data/foo.txt
. Что я ошибаюсь?
filepath.toString()
new File(parent, child)
Ответы:
Хотя исходное решение для получения текущего каталога с помощью файла
empty String
работает. Но рекомендуется использоватьuser.dir
свойство для текущего каталога иuser.home
для домашнего каталога.вывод:
Из документации по классу пути Java :
Почему
Paths.get("").toAbsolutePath()
работаетКогда в объект передается пустая строка
Paths.get("")
, возвращаемыйPath
объект содержит пустой путь. Но когда мы вызываемPath.toAbsolutePath()
, он проверяет, больше ли длина пути нуля, в противном случае он используетuser.dir
системное свойство и возвращает текущий путь.Вот код для реализации файловой системы Unix: UnixPath.toAbsolutePath ()
В основном вам нужно создать
Path
экземпляр снова, как только вы разрешите текущий путь к каталогу.Также я бы предложил использовать
File.separatorChar
для независимого от платформы кода.Вывод:
источник
separatorChar
уступает какой-то «абстракции более высокого уровня», что-то вродеPathBuilder(currentRelativePath).append("data").append("foo.txt")
Paths#get(String first, String... more)
состояния,Чтобы получить текущий каталог пользователя, вы можете просто использовать
System.getProperty("user.dir")
.Кроме того,
get
метод использует переменную длину аргумент изString
, который будет использоваться , чтобы обеспечить последующие строки пути. Итак, чтобы создатьPath
для/test/inside/abc.txt
вас, вы должны использовать его следующим образом:источник
Не конкретный метод.
Если вы используете java 8 или выше, у вас есть 2 варианта:
а) Используйте java.util.StringJoiner
б) Использование
String.join(File.pathSeparator, "path1", "path2");
Если вы используете java 7 или ниже, вы можете использовать библиотеку commons-lang из apache commons. У класса StringUtils есть метод соединения строк с помощью разделителя.
в)
StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Примечание: вы можете использовать разделитель путей Linux "/" для окон (просто помните, что абсолютные пути - это что-то вроде "/ C: / mydir1 / mydir2". Использование всегда "/" очень полезно, если вы используете такие протоколы, как file: //
источник
/home/user/test:foo.txt
File.separator
работал у меня вместоFile.pathSeparator
Самый простой способ:
Вы никогда не должны писать
Paths.get("")
. Я удивлен, что это вообще работает. Если вы хотите явно ссылаться на текущий каталог, используйтеPaths.get(System.getProperty("user.dir"))
. Если вам нужен домашний каталог пользователя, используйтеPaths.get(System.getProperty("user.home"))
.Также можно комбинировать подходы:
источник
Самый надежный и независимый от платформы способ соединения путей в Java - это использование
Path::resolve
(как указано в JavaDoc дляPaths::get
). Для массива строк произвольной длины, представляющих части пути, они могут быть объединены вместе с помощью Java Stream:источник
Вы можете сделать как
Хороший подробный пост здесь. Пример использования пути.
источник