File.separator или File.pathSeparator


519

В Fileклассе есть две строки, separatorа pathSeparator.

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


6
Названия немного сбивают с толку, быстрота, в которой нужно что-то подобное, просто ужасна (ср. Perl). Посмотрите на примеры для pathSeparatorChar и separatorChar . Или используйте простую мнемонику: pathSeparator разделяет пути.
Maaartinus

6
Потратив минуту на вывод их обоих на экран, я бы ответил на ваш вопрос ...
Жан-Франсуа Корбетт

13
Хотя я в целом согласен, простое их печатание на его системе не покажет варианты для других операционных систем.
b1nary.atr0phy

Ответы:


680

Если вы имеете в виду, File.separatorа File.pathSeparatorзатем:

  • File.pathSeparatorиспользуется для разделения отдельных путей к файлам в списке путей к файлам. Рассмотрим в Windows переменную среды PATH. Вы используете ;для разделения путей к файлам так, чтобы в Windows File.pathSeparatorбыло ;.

  • File.separatorлибо, /либо \используется для разделения пути к определенному файлу. Например, в Windows это \илиC:\Documents\Test


6
Похоже, File.separatorдолжно быть в File.fileSeparatorотношенииFile.pathSeparator
Эдди

1
@ Эдди, я понимаю вашу точку зрения, но она может быть излишней, так как имя класса File. Я думаю, что часть файла подразумевается. Но кто знает, почему они сделали многое из того, что сделали с Java.
user489041

117

Вы используете разделитель при создании пути к файлу. Так что в Unix разделитель есть /. Так что, если вы хотите построить путь Unix, /var/tempвы бы сделали это так:

String path = File.separator + "var"+ File.separator + "temp"

Вы используете, pathSeparatorкогда имеете дело со списком файлов, как в пути к классам. Например, если ваше приложение приняло список jar-файлов в качестве аргумента, стандартный способ форматирования этого списка в unix:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Итак, учитывая список файлов, вы бы сделали что-то вроде этого:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);

5
Если вы создаете путь * nix, /var/tempто использовать его бесполезно, File.separatorпоскольку у вас уже есть зависимый от платформы код. Можно также жестко закодировать путь.
Исапир

109

java.io.Fileкласс содержит четыре статических переменных-разделителя. Для лучшего понимания давайте разберемся с помощью некоторого кода

  1. separator: зависимый от платформы символ разделителя имен по умолчанию в виде String. Для Windows это '\', а для Unix это '/'
  2. separatorChar: то же самое, что и разделитель, но это символ
  3. pathSeparator: зависимая от платформы переменная для пути-разделителя. Например, переменная PATH или CLASSPATH - список путей, разделенных ':' в системах Unix и ';' в системе Windows
  4. pathSeparatorChar: То же, что pathSeparator, но это символ

Обратите внимание, что все они являются конечными переменными и зависят от системы.

Вот Java-программа для печати этих переменных-разделителей. FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

Вывод вышеуказанной программы в систему Unix:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

Вывод программы на систему Windows:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

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

Вот фрагмент кода, показывающий, как правильно использовать разделители.

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

1
Обратите внимание, что в Java символ обратной косой черты на самом деле является \\, потому что одна обратная косая черта является escape-символом для других специальных сокращенных символов, поэтому сама обратная косая черта используется для экранирования. StringИ charвозвращенным выше способов сделать возвращают правильно отформатированный обратную косую черту (если на Windows).
Эрик

новый файл ("tmp / abc.txt"); это в основном для windows и linux, но не для unix new File ("tmp \\ abc.txt"); Это проблема только Unix
DEV-Jacol
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.