Разница между File.separator и slash в путях

В чем разница между использованием File.separator и нормальным / в Java Path-String?

В отличие от двойной обратной косой черты \\ независимость от платформы, по-видимому, не является причиной, поскольку обе версии работают под Windows и Unix.

public class SlashTest {
    @Test
    public void slash() throws Exception {
        File file = new File("src/trials/SlashTest.java");
        assertThat(file.exists(), is(true));
    }

    @Test
    public void separator() throws Exception {
        File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
        assertThat(file.exists(), is(true));
    }
}

Чтобы перефразировать вопрос, если / работает в Unix и Windows, почему нужно когда-либо использовать File.separator?

Ответ 1

В библиотеках Java для работы с файлами вы можете безопасно использовать / (косая черта, а не обратная косая черта) на всех платформах. Код библиотеки обрабатывает все вещи на пути к конкретным платформам.

Возможно, вы захотите использовать File.separator в пользовательском интерфейсе, потому что лучше показать людям, что будет иметь смысл в их ОС, а не то, что имеет смысл для Java.

Обновление. Я не смог за пять минут поиска найти поведение "вы всегда можете использовать косая черта". Теперь я уверен, что видел, как это задокументировано, но в случае отсутствия официальной ссылки (потому что моя память не идеальна) я придерживаюсь использования File.separator, потому что вы знаете, что это сработает.

Ответ 2

Вы используете File.separator, потому что когда-нибудь ваша программа может работать на платформе, разработанной на далекой земле, стране странных вещей и незнакомых людей, где лошади плачут и коров управляют всеми лифтами. На этой земле люди традиционно использовали символ ":" в качестве разделителя файлов, и поэтому покорно JVM подчиняется их желаниям.

Ответ 3

Хотя использование File.separator для ссылки на имя файла является излишним (для тех, кто воображает отдаленные земли, я предполагаю, что их реализация JVM заменит / на : так же, как Windows jvm заменит его на \).

Однако иногда вы получаете ссылку на файл, а не создаете его, и вам нужно его разобрать, и чтобы это можно было сделать, вам нужно знать разделитель на платформе. File.separator поможет вам в этом.

Ответ 4

Ну, есть больше ОС, чем Unix и Windows (переносные устройства и т.д.), а Java известна своей мобильностью. Лучшей практикой является его использование, поэтому JVM может определить, какой из них лучше всего подходит для этой ОС.

Ответ 5

Хотя это не имеет большого значения на пути, он делает это на обратном пути.

Конечно, вы можете использовать "/" или "\" в новом файле (String path), но File.getPath() предоставит вам только один из них.

Ответ 6

портативность простая и простая.

Ответ 7

Поздняя вечеринка. Я на Windows 10 с JDK 1.8 и Eclipse MARS 1.
Я считаю, что

getClass().getClassLoader().getResourceAsStream("path/to/resource");

работает и

getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");

не работает и

getClass().getClassLoader().getResourceAsStream("path\to\resource");

не работает. Последние два эквивалентны. Итак... У меня есть все основания НЕ использовать File.separator.

Ответ 8

ОК, чтобы проверить код.
File.java строки с 428 по 435 в File.<init>:

String p = uri.getPath();
if (p.equals(""))
    throw new IllegalArgumentException("URI path component is empty");

// Okay, now initialize
p = fs.fromURIPath(p);
if (File.separatorChar != '/')
p = p.replace('/', File.separatorChar);

И пусть читать fs/*(FileSystem)*/.fromURIPath() docs:

java.io.FileSystem
public abstract String fromURIPath (String path)
По необходимости обработайте указанную строку пути URI. Это используется для win32, например, для преобразования "/c:/foo" в "c:/foo". Строка пути все еще есть разделители слэш; код в классе File переведет их после возврата этого метода.

Это означает, что FileSystem.fromURIPath() выполняет постобработку по пути URI только в Windows и потому, что в следующей строке:

p = p.replace('/', File.separatorChar);

Он заменяет каждый '/' системным зависимым seperatorChar, вы всегда можете быть уверены, что '/' безопасно в каждой ОС.

Ответ 9

Как джентльмены описали разницу с деталями варианта.

Я бы рекомендовал использовать Apache Commons io api, class FilenameUtils при работе с файлами в программе с возможностью развертывания на нескольких ОС.

Ответ 10

Путь к файлу или каталогу задается с помощью соглашений об именах хост-системы. Однако класс File определяет зависящие от платформы константы, которые могут использоваться для обработки имен файлов и каталогов независимым от платформы способом.

Files.seperator определяет символ или строку, разделяющую каталог и файловые компоненты в имени пути. Этот разделитель равен '/', '\' или ':' для Unix, Windows и Macintosh, соответственно.

Ответ 12

"Java SE8 для программистов" утверждает, что Java тоже справится. (стр. 480, последний абзац). В этом примере утверждается, что:

c:\Program Files\Java\jdk1.6.0_11\demo/jfc

будет разбираться просто отлично. Обратите внимание на последний (Unix-стиль) разделитель.

Он липкий и, вероятно, подверженный ошибкам, но это то, что они (Deitel и Deitel) утверждают.

Я думаю, что путаница для людей, а не для Java, является достаточной причиной для использования этой функции (mis?).

Ответ 13

Используя File.separator, Ubuntu сгенерировал файлы с "\" на нем вместо каталогов. Может быть, я ленив, как я делаю файлы (и каталоги), и мог бы избежать этого, независимо от того, используйте "/" каждый раз, чтобы избежать файлов с "\" на нем имя