Подтвердить что ты не робот

Есть ли утилита 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?

4b9b3361

Ответ 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 отличается, поэтому вы не будете искать такой каталог