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.