Вопрос-ответ

Difference between File.separator and slash in paths

Разница между File.separator и косой чертой в путях

В чем разница между использованием File.separator и обычной / строкой пути Java?

В отличие от двойной обратной косой черты, \\ независимость от платформы, похоже, не является причиной, поскольку обе версии работают под 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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Хорошо, давайте проверим некоторый код.

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() документы:


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


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

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

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

java