File.separator atau File.pathSeparator

519

Di Filekelas ada dua string, separatordan pathSeparator.

Apa bedanya? Kapan saya harus menggunakan yang satu?

icnhzabot
sumber
6
Penamaannya agak membingungkan, cepat bahwa sesuatu seperti ini diperlukan benar-benar mengerikan (lih. Perl). Lihatlah contoh pathSeparatorChar dan separatorChar . Atau gunakan mnemonik sederhana: pathSeparator memisahkan jalur.
maaartinus
6
Meluangkan waktu sebentar untuk mencetak keduanya di layar akan menjawab pertanyaan Anda ...
Jean-François Corbett
13
Meskipun saya umumnya setuju, hanya mencetaknya di sistemnya tidak akan menunjukkan varian untuk sistem operasi lain.
b1nary.atr0phy

Jawaban:

680

Jika Anda maksud File.separatordan File.pathSeparatorkemudian:

  • File.pathSeparatordigunakan untuk memisahkan jalur file individual dalam daftar jalur file. Pertimbangkan pada windows, variabel lingkungan PATH. Anda menggunakan a ;untuk memisahkan jalur file sehingga Windows File.pathSeparatorakan ;.

  • File.separatoradalah salah satu /atau \yang digunakan untuk membagi path ke file tertentu. Misalnya pada Windows itu \atauC:\Documents\Test

pengguna489041
sumber
6
Sepertinya File.separatorharus File.fileSeparatormengenaiFile.pathSeparator
Eddy
1
@ Eddy, saya mengerti maksud Anda, tetapi mungkin berlebihan karena nama kelasnya File. Saya pikir bagian file tersirat. Tapi siapa yang tahu mengapa mereka melakukan banyak hal dengan Java.
user489041
117

Anda menggunakan pemisah ketika Anda sedang membangun jalur file. Jadi di unix pemisahnya /. Jadi jika Anda ingin membangun jalur unix /var/tempAnda akan melakukannya seperti ini:

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

Anda menggunakan pathSeparatorketika Anda berurusan dengan daftar file seperti di classpath. Misalnya, jika aplikasi Anda menggunakan daftar toples sebagai argumen, cara standar untuk memformat daftar itu di unix adalah:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Jadi diberi daftar file yang akan Anda lakukan seperti ini:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);
Karthik Ramachandran
sumber
5
Jika Anda membangun jalur * nix seperti /var/tempitu maka tidak berguna untuk digunakan File.separatorkarena Anda sudah memiliki kode yang bergantung pada platform. Mungkin juga hardcode jalannya.
isapir
109

java.io.Filekelas berisi empat variabel pemisah statis. Untuk pemahaman yang lebih baik, Mari kita pahami dengan bantuan beberapa kode

  1. separator: Platform-nama karakter pemisah default tergantung sebagai String. Untuk windows, ini '\' dan untuk unix itu '/'
  2. separatorChar: Sama seperti separator tapi itu char
  3. pathSeparator: Variabel dependen platform untuk path-separator. Misalnya PATH atau CLASSPATH daftar variabel jalur yang dipisahkan oleh ':' di sistem Unix dan ';' dalam sistem Windows
  4. pathSeparatorChar: Sama seperti pathSeparator tapi ini char

Perhatikan bahwa semua ini adalah variabel final dan ketergantungan sistem.

Berikut adalah program java untuk mencetak variabel pemisah ini. 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);
    }

}

Output dari program di atas pada sistem Unix:

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

Output dari program pada sistem Windows:

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

Untuk membuat platform program kami independen, kami harus selalu menggunakan pemisah ini untuk membuat jalur file atau membaca variabel sistem apa pun seperti PATH, CLASSPATH.

Berikut ini cuplikan kode yang menunjukkan cara menggunakan pemisah dengan benar.

//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
sumber
1
Perhatikan bahwa di Jawa karakter backslash sebenarnya adalah \\, karena backslash tunggal adalah karakter pelarian untuk steno karakter khusus lainnya, sehingga backslash sendiri digunakan untuk melarikan diri. The Stringdan chardikembalikan oleh metode yang disebutkan di atas tidak mengembalikan backslash diformat dengan benar (jika pada Windows).
Erik
File baru ("tmp / abc.txt"); ini benar untuk windows dan linux tetapi ini tidak benar untuk unix File baru ("tmp \\ abc.txt"); ini hanya masalah unix
DEV-Jacol