Есть ли утилита Java, которая преобразует строковый путь, чтобы использовать правильный разделитель файлов char?
Я разработал ряд классов, которые управляют файлами на Java. Я работаю над коробкой Linux и блаженно набираю new File("path/to/some/file");
. Когда пришло время совершить я понял, что некоторые другие разработчики проекта используют Windows. Теперь я хотел бы вызвать метод, который может принимать строку вида "/path/to/some/file"
и, в зависимости от ОС, возвращает правильно разделенный путь.
например:"path/to/some/file"
становится "pathtosomefile"
на Windows.
В Linux это просто возвращает заданную строку.
Я понимаю, что это не займет много времени, чтобы создать регулярное выражение, которое могло бы это сделать, но я не собираюсь изобретать колесо и предпочел бы правильно протестированное решение. Было бы неплохо, если бы он был встроен в JDK, но если это часть небольшой библиотеки F/OSS, это тоже хорошо.
Итак, есть ли утилита Java, которая преобразует строковый путь, чтобы использовать правильный разделитель файлов char?
9 ответов
Apache Commons приходит на помощь (снова). Метод Commons IO FileNameUtils.separatorsToSystem() будет делать то, что вы хотите.
Излишне говорить, что Apache Commons IO сделает намного больше, и стоит посмотреть.
A "/path/to/some/file"
на самом деле работает под Windows Vista и XP.
new java.io.File("/path/to/some/file").getAbsoluteFile()
> C:\path\to\some\file
но все равно не портативный как в Windows несколько корни. Таким образом, корневой каталог должен быть выбран каким-то образом. Не должно быть никаких проблем с относительными путями.
Edit:
Apache commons io тут не справка с envs, отличными от unix и windows. источник ввода-вывода Apache код:
public static String separatorsToSystem(String path) {
if (path == null) {
return null;
}
if (isSystemWindows()) {
return separatorsToWindows(path);
} else {
return separatorsToUnix(path);
}
}
С новой Java 7 они включили класс под названием Paths это позволяет вам делать именно то, что вы хотите (см. http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html)
вот пример:
String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
Это то, что делает Apache commons-io, развернутый в пару строк кода:
String separatorsToSystem(String path) {
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);
}
}
поэтому, если вы хотите избежать дополнительной зависимости, просто используйте это.
У вас есть возможность использовать
System.getProperty("file.separator")
построить строку, представляющую путь?
для тех, кто пытается сделать это 7 лет спустя, метод Apache commons separatorsToSystem был перемещен в класс FilenameUtils:
FilenameUtils.separatorsToSystem(String path)
Я думаю, что есть эта дыра в Java пути.
String rootStorePath = пути.сделать("c:/projects/mystuff/").toString ();
работает, если вы используете его в системе с файловой системой, которую вам нужно использовать. Как указывалось, он использовал текущую файловую систему OS.
Мне нужно работать с путями между windows и linux, скажем, копировать файл из одного в другой. При использовании " / " каждый работает, я думаю, если вы используете все команды Java, но мне нужно сделать sftp позвоните так, используя / или файл.сепаратор etc... не помогает мне. Я не могу использовать Path (), потому что он преобразует мой в файловую систему по умолчанию, которую я запускаю "сейчас".
Что нужно Java:
`в системах Windows:
Path posixPath = пути.get ("/home / mystuff", файловая система.В POSIX );
остается / home/ mystuff / и не преобразуется в \home\mystuff
в системе linux: Строка winPath = пути.получить("c:\home\mystuff", файловая система.Windows.)toString ();` остается c:\home\mystuff и не получить преобразование в /c:/home/mystuff
аналогично работе с наборами символов:
средств кодирования.кодирование ("что угодно здесь", "UTF-8").getBytes ();
P. S. Я тоже не хочу, чтобы загрузить весь файл Apache банку Ио делать что-то просто. В данном случае у них нет того, что я предлагаю.
String fileName = Paths.get(fileName).toString();
отлично работает с Windows, по крайней мере, даже со смешанными путями, например
c:\users\username/myproject\myfiles/myfolder
становится
c:\users\username\myproject\myfiles\myfolder
извините, не проверили, что Linux сделает из вышесказанного, но опять же структура файлов Linux отличается, поэтому вы не будете искать такой каталог