File.separator hoặc File.pathSeparator


519

Trong Filelớp có hai chuỗi, separatorpathSeparator.

Có gì khác biệt? Khi nào tôi nên sử dụng cái này hơn cái kia?


6
Việc đặt tên hơi khó hiểu, nhanh chóng mà một cái gì đó như thế này là cần thiết là khủng khiếp (xem Perl). Nhìn vào các ví dụ cho pathSeparatorCharseparatorChar . Hoặc sử dụng các kiểu ghi nhớ đơn giản: pathSpayator tách các đường dẫn.
maaartinus

6
Dành một phút để in cả hai lên màn hình sẽ trả lời câu hỏi của bạn ...
Jean-François Corbett

13
Mặc dù tôi thường đồng ý, chỉ cần in chúng trên hệ thống của anh ấy sẽ không hiển thị các biến thể cho các hệ điều hành khác.
b1nary.atr0phy

Câu trả lời:


681

Nếu bạn có ý File.separatorFile.pathSeparatorsau đó:

  • File.pathSeparatorđược sử dụng để phân tách các đường dẫn tệp riêng lẻ trong một danh sách các đường dẫn tệp. Xem xét trên các cửa sổ, biến môi trường PATH. Bạn sử dụng một ;để tách các đường dẫn tập tin để trên Windows File.pathSeparatorsẽ ;.

  • File.separator/hoặc \được sử dụng để phân chia đường dẫn đến một tệp cụ thể. Ví dụ trên Windows, nó là \hoặcC:\Documents\Test


6
Có vẻ như File.separatornên File.fileSeparatorliên quan đếnFile.pathSeparator
Eddy

1
@Eddy Tôi thấy quan điểm của bạn, nhưng nó có thể là dư thừa vì tên lớp là File. Tôi nghĩ rằng phần tập tin được ngụ ý. Nhưng ai biết tại sao họ đã làm rất nhiều những gì họ đã làm với Java.
dùng489041

117

Bạn sử dụng dấu phân cách khi bạn đang xây dựng đường dẫn tệp. Vì vậy, trong unix phân cách là /. Vì vậy, nếu bạn muốn xây dựng đường dẫn unix, /var/tempbạn sẽ làm như thế này:

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

Bạn sử dụng pathSeparatorkhi bạn đang xử lý một danh sách các tệp như trong đường dẫn lớp. Ví dụ: nếu ứng dụng của bạn lấy danh sách các lọ làm đối số thì cách tiêu chuẩn để định dạng danh sách đó trên unix là:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Vì vậy, đưa ra một danh sách các tập tin bạn sẽ làm một cái gì đó như thế này:

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

5
Nếu bạn đang xây dựng một đường dẫn * nix như vậy /var/tempthì sẽ vô dụng File.separatorkhi bạn sử dụng mã phụ thuộc vào nền tảng. Cũng có thể hardcode đường dẫn.
isapir

109

java.io.Filelớp chứa bốn biến phân tách tĩnh. Để hiểu rõ hơn, chúng ta hãy hiểu với sự giúp đỡ của một số mã

  1. Dấu phân cách: Ký tự phân tách tên mặc định phụ thuộc nền tảng là Chuỗi. Đối với cửa sổ, đó là '\' và đối với unix, nó '/'
  2. separatorChar: Tương tự như separator nhưng nó là char
  3. pathSpayator: Biến phụ thuộc nền tảng cho đường phân cách. Ví dụ: danh sách biến PATH hoặc CLASSPATH của các đường dẫn được phân tách bằng ':' trong các hệ thống Unix và ';' trong hệ thống Windows
  4. pathSeparatorChar: Tương tự như pathSpayator nhưng nó là char

Lưu ý rằng tất cả những điều này là các biến cuối cùng và phụ thuộc hệ thống.

Đây là chương trình java để in các biến phân cách này. FileSpayator.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);
    }

}

Đầu ra của chương trình trên trên hệ thống Unix:

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

Đầu ra của chương trình trên hệ thống Windows:

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

Để làm cho nền tảng chương trình của chúng tôi độc lập, chúng ta nên luôn luôn sử dụng các dấu phân cách này để tạo đường dẫn tệp hoặc đọc bất kỳ biến hệ thống nào như PATH, CLASSPATH.

Đây là đoạn mã chỉ ra cách sử dụng dấu phân cách chính xác.

//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
Lưu ý rằng trong Java, ký tự dấu gạch chéo ngược thực sự là \\, bởi vì dấu gạch chéo ngược đơn là ký tự thoát cho các tốc ký ký tự đặc biệt khác, do đó, dấu gạch chéo ngược được sử dụng để tự thoát. Các Stringcharcác phương thức được trả lại ở trên trả về dấu gạch chéo ngược được định dạng đúng (nếu trên Windows).
Erik

Tệp mới ("tmp / abc.txt"); đây là một cách rõ ràng cho windows và linux nhưng đây không phải là tập tin mới cho unix File mới ("tmp \\ abc.txt"); đây chỉ là vấn đề unix
DEV-Jacol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.