File.separator або File.pathSeparator


519

У Fileкласі є два рядки separatorта pathSeparator.

Яка різниця? Коли я повинен використовувати один над іншим?


6
Іменування трохи заплутано, швидкість, що щось подібне потрібно, - це просто жахливо (пор. Perl). Подивіться приклади для pathSeparatorChar та separatorChar . Або скористайтеся простими мнемоніками: pathSeparator розділяє шляхи.
maaartinus

6
Виділивши хвилину для друку обох на екран, відповів би на ваше запитання ...
Jean-François Corbett

13
Хоча я, як правило, погоджуюся, просто надрукувати їх на його системі не буде показано варіантів для інших операційних систем.
b1nary.atr0phy

Відповіді:


681

Якщо ви маєте на увазі 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
@Eddy Я бачу вашу думку, але це може бути зайвим, оскільки назва класу є File. Я думаю, що частина файлу мається на увазі. Але хто знає, чому вони зробили багато того, що зробили з Java.
user489041

117

Ви використовуєте роздільник, коли ви будуєте шлях до файлу. Так в Unix роздільник є /. Тож якби ви хотіли побудувати шлях до Unix /var/temp, зробили б це так:

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

Ви використовуєте, pathSeparatorколи ви маєте справу зі списком файлів, як на класному шляху. Наприклад, якщо ваша програма взяла список аркушів як аргумент, стандартним способом форматування цього списку в 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оскільки у вас вже є код, який залежить від платформи. Можливо також жорсткий код шляху.
isapir

109

java.io.Fileклас містить чотири статичні роздільні змінні. Для кращого розуміння розберемося за допомогою якогось коду

  1. separator: Символ роздільника імен, що залежить від платформи, як String. Для Windows це "\", а для unix - "/"
  2. separatorChar: Те саме, що роздільник, але це char
  3. pathSeparator: змінна залежність від платформи для роздільника шляху. Наприклад, список змінних PATH або CLASSPATH шляхів, розділених ':' в системах Unix і ';' в системі Windows
  4. pathSeparatorChar: Те саме, що і pathSeparator, але це char

Зауважте, що всі ці є кінцевими змінними та залежать від системи.

Ось програма 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 символом зворотної косої риси насправді є \\, тому що один зворотний косий рисок - це символ втечі для інших спеціальних скорочень символів, тому сама косої косої риси використовується для виходу із себе. StringІ charповернутим вище способів зробити повертають правильно відформатований зворотну косу риску (якщо на Windows).
Ерік

новий файл ("tmp / abc.txt"); це якраз для Windows та Linux, але це не є коректно для нового файлу unix ("tmp \\ abc.txt"); це лише проблема Unix
DEV-Jacol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.