Есть ли утилита 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 банку Ио делать что-то просто. В данном случае у них нет того, что я предлагаю.


разве недостаточно сказать:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"

String fileName = Paths.get(fileName).toString();

отлично работает с Windows, по крайней мере, даже со смешанными путями, например

c:\users\username/myproject\myfiles/myfolder

становится

c:\users\username\myproject\myfiles\myfolder

извините, не проверили, что Linux сделает из вышесказанного, но опять же структура файлов Linux отличается, поэтому вы не будете искать такой каталог