File.separator lub File.pathSeparator

519

W Fileklasie są dwa ciągi, separatori pathSeparator.

Co za różnica? Kiedy powinienem używać jednego na drugim?

icnhzabot
źródło
6
Nazewnictwo jest nieco mylące, szybkość, że potrzebne jest coś takiego, jest po prostu straszna (por. Perl). Spójrz na przykłady pathSeparatorChar i separatorChar . Lub użyj prostych mnemoników: pathSeparator oddziela ścieżki.
maaartinus
6
Poświęcenie minuty na wydrukowanie obu z nich na ekranie odpowiedziałoby na twoje pytanie ...
Jean-François Corbett,
13
Chociaż ogólnie się zgadzam, po prostu wydrukowanie ich na swoim systemie nie pokaże wariantów dla innych systemów operacyjnych.
b1nary.atr0phy

Odpowiedzi:

681

Jeśli masz na myśli, File.separatora File.pathSeparatornastępnie:

  • File.pathSeparatorsłuży do oddzielania poszczególnych ścieżek plików na liście ścieżek plików. Rozważ w systemie Windows zmienną środowiskową PATH. Używasz ;oddzielić ścieżki plików więc na Windows File.pathSeparatorbędzie ;.

  • File.separatorjest albo /albo \, który jest używany do dzielenia się ścieżkę do pliku określonego. Na przykład w systemie Windows jest to \lubC:\Documents\Test

użytkownik489041
źródło
6
Wygląda na to, File.separatornależy File.fileSeparatorregardingFile.pathSeparator
Eddy
1
@Eddy Rozumiem twój punkt widzenia, ale może być zbędny, ponieważ nazwa klasy to File. Myślę, że sugerowana jest część pliku. Ale kto wie, dlaczego zrobili wiele z tego, co zrobili z Javą.
user489041,
117

Podczas budowania ścieżki do pliku używasz separatora. Tak więc w unixie separatorem jest /. Więc jeśli chcesz zbudować ścieżkę uniksową /var/temp, zrobiłbyś to w ten sposób:

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

Korzystasz z tego, pathSeparatorgdy masz do czynienia z listą plików, takich jak ścieżka klasy. Na przykład, jeśli Twoja aplikacja jako argument przyjęła listę słoików, standardowym sposobem formatowania tej listy w systemie Unix jest:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Biorąc pod uwagę listę plików, zrobiłbyś coś takiego:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);
Karthik Ramachandran
źródło
5
Jeśli budujesz ścieżkę * nix w taki sposób, /var/tempże jest to bezużyteczne, File.separatorponieważ masz już kod zależny od platformy. Równie dobrze może zakodować ścieżkę.
isapir
109

java.io.Fileklasa zawiera cztery statyczne zmienne separujące. Aby lepiej zrozumieć, zrozummy za pomocą jakiegoś kodu

  1. separator: Zależny od platformy domyślny znak separatora nazwy jako Ciąg. W systemie Windows jest to „\”, a w systemie Unix - „/”
  2. separatorChar: To samo co separator, ale jest char
  3. pathSeparator: Zmienna zależna od platformy dla separatora ścieżek. Na przykład lista zmiennych PATH lub CLASSPATH ścieżek oddzielonych „:” w systemach uniksowych i „;” w systemie Windows
  4. pathSeparatorChar: To samo co pathSeparator, ale jest char

Zauważ, że wszystkie są zmiennymi końcowymi i zależą od systemu.

Oto program Java do drukowania tych zmiennych separatora. 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);
    }

}

Wyjście powyższego programu w systemie Unix:

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

Dane wyjściowe programu w systemie Windows:

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

Aby nasza platforma programu była niezależna, zawsze powinniśmy używać tych separatorów do tworzenia ścieżki do pliku lub odczytywania dowolnych zmiennych systemowych, takich jak PATH, CLASSPATH.

Oto fragment kodu pokazujący, jak poprawnie używać separatorów.

//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");
foxt7ot
źródło
1
Zauważ, że w Javie znakiem odwrotnego ukośnika jest \\, ponieważ pojedynczy odwrotny ukośnik jest znakiem ucieczki dla innych skrótów znaków specjalnych, więc sam odwrotny ukośnik służy do ucieczki. StringI charzwrócony przez wyżej wymienionych metod nie zwróci prawidłowo sformatowany odwrotny ukośnik (jeśli w systemie Windows).
Erik
nowy plik („tmp / abc.txt”); jest to poprawne w przypadku systemu Windows i Linux, ale nie jest poprawne w przypadku nowego pliku uniksowego („tmp \\ abc.txt”); to jest problem tylko unix
DEV-Jacol