Есть ли утилита Java, которая преобразует путь String, чтобы использовать правильный разделитель файлов char?
Я разработал ряд классов, которые манипулируют файлами в Java. Я работаю над ящиком Linux и блаженно печатаю new File("path/to/some/file");
. Когда пришло время совершить, я понял, что некоторые другие разработчики проекта используют Windows. Теперь я хотел бы вызвать метод, который может принимать в String формы "/path/to/some/file"
и, в зависимости от ОС, вернуть правильно выделенный путь.
Например:
"path/to/some/file"
становится "path\\to\\some\\file"
в Windows.
В Linux он просто возвращает заданную строку.
Я понимаю, что не займет много времени, чтобы выбить регулярное выражение, которое могло бы это сделать, но я не собираюсь изобретать колесо и предпочитаю правильно протестированное решение. Было бы неплохо, если бы он был встроен в JDK, но если бы он был частью небольшой библиотеки F/OSS, это тоже хорошо.
Итак, есть утилита Java, которая преобразует путь String для использования правильного разделителя файлов char?
Ответы
Ответ 1
Apache Commons
приходит на помощь (снова). Метод Commons IO
FilenameUtils.separatorsToSystem(String path)
будет делать то, что вы хотите.
Излишне говорить, что Apache Commons IO
сделает гораздо больше, и на него стоит обратить внимание.
Ответ 2
A "/path/to/some/file"
фактически работает под Windows Vista и XP.
new java.io.File("/path/to/some/file").getAbsoluteFile()
> C:\path\to\some\file
Но он по-прежнему не переносится, поскольку Windows имеет несколько roots. Поэтому корневой каталог должен быть каким-то образом выбран. Не должно быть проблем с относительными путями.
Edit:
Apache commons io делает не помощь с envs, кроме unix и windows. Исходный код Apache io:
public static String separatorsToSystem(String path) {
if (path == null) {
return null;
}
if (isSystemWindows()) {
return separatorsToWindows(path);
} else {
return separatorsToUnix(path);
}
}
Ответ 3
С новым Java 7 они включили класс Paths, который позволяет вам делать именно то, что вы хотите (см. http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html)
вот пример:
String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
Ответ 4
Вот что делает Apache commons-io, развернутый в несколько строк кода:
String separatorsToSystem(String res) {
if (res==null) return null;
if (File.separatorChar=='\\') {
// From Windows to Linux/Mac
return res.replace('/', File.separatorChar);
} else {
// From Linux/Mac to Windows
return res.replace('\\', File.separatorChar);
}
}
Так что если вы хотите избежать дополнительной зависимости, просто используйте это.
Ответ 5
У вас есть возможность использовать
System.getProperty("file.separator")
чтобы построить строку, представляющую путь?
Ответ 6
Для тех, кто пытается это сделать через 7 лет, метод apache commons separatorsToSystem был перенесен в класс FilenameUtils:
FilenameUtils.separatorsToSystem(String path)
Ответ 7
Я думаю, что в Java Paths есть эта дыра.
String rootStorePath = Paths.get("c: /projects/mystuff/"). ToString();
работает, если вы работаете в системе, в которой есть файловая система, которую вам нужно использовать. Как указывалось, он использовал текущую файловую систему ОС.
Мне нужно работать с путями между Windows и Linux, скажем, чтобы скопировать файл из одного в другой. При использовании "/" каждая работа, я думаю, если вы используете все команды Java, но мне нужно сделать вызов sftp, так что использование/или file.separator и т.д... мне не поможет. Я не могу использовать Path(), потому что он конвертирует мою в файловую систему по умолчанию, на которой я работаю "сейчас".
Что нужно Java это:
'в системе Windows: путь posixPath = Paths.get("/home/mystuff", FileSystem.Posix); остается /home/mystuff/и не конвертируется в \home\mystuff
в системе Linux: String winPath = Paths.get("c:\home\mystuff", FileSystem.Windows).toString(); ' остается c:\home\mystuff и не конвертируется в /c: /home/mystuff
аналогично работе с наборами символов:
URLEncoder.encode("что угодно здесь", "UTF-8").getBytes();
PS Я также не хочу загружать целый файл apache io jar, чтобы сделать что-то простое. В этом случае у них нет того, что я предлагаю в любом случае.
Ответ 8
Не следует ли говорить:
"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"
Ответ 9
String fileName = Paths.get(fileName).toString();
Работает отлично с Windows по крайней мере даже со смешанными путями, например
C:\Users\имя пользователя/MyProject\MyFiles/моя_папка
становится
c:\users\username\myproject\myfiles\myfolder
Извините, не проверил, что Linux сделает из вышеперечисленного, но там снова структура файлов Linux отличается, поэтому вы не будете искать такой каталог