File.separator vs FileSystem.getSeparator () vs System.getProperty (tập tin tập tin.separator)?


136

Dường như có ba cách giống nhau để độc lập nền tảng "phân tách tệp" phụ thuộc vào nền tảng:

Làm thế nào để chúng ta quyết định khi sử dụng mà?

Có sự khác biệt nào giữa chúng không?


Bạn không thực sự có được trình phân tách tệp phụ thuộc nền tảng ở đây? Chỉ trong một trang viên độc lập nền tảng.
steinybot

@Steiny, Yea, đã cập nhật.
Pacerier

Một câu hỏi Java điển hình có ít nhất 3 câu trả lời trở lên
Mèo Tonerpson

Câu trả lời:


142

System.getProperties()có thể bị ghi đè bởi các cuộc gọi đến System.setProperty(String key, String value)hoặc với các tham số dòng lệnh-Dfile.separator=/

File.separator được phân tách cho hệ thống tập tin mặc định.

FileSystems.getDefault() giúp bạn có hệ thống tập tin mặc định.

FileSystem.getSeparator()giúp bạn có ký tự phân cách cho hệ thống tập tin. Lưu ý rằng là một phương thức cá thể, bạn có thể sử dụng phương thức này để chuyển các hệ thống tệp khác nhau sang mã của bạn ngoài mã mặc định, trong trường hợp bạn cần mã của mình để hoạt động trên nhiều hệ thống tệp trong một JVM.


2
Cool = D Btw bạn có thể giải thích về phần "vận hành nhiều hệ thống tập tin" không?
Pacerier

4
@Pacerier Về lý thuyết, nếu tôi viết một hệ thống tập tin mới (BringerFS) có ký tự phân tách là ":" và bạn có một máy có 2 phân vùng, một ở NTFS và một trong BringerFS, chức năng này sẽ cho phép bạn sử dụng cả hai (giả sử Tôi cũng đã viết một nhà cung cấp Java Filesystem).
Bringer128

Ý tôi là thực tế nó có hữu ích không, như nói ai đó có 2 phân vùng một Windows và một UNIX và anh ta đang chạy ứng dụng của tôi (trên phân vùng Windows của anh ta), đó có phải là lớp có thể truy cập hệ thống tệp UNIX của anh ta không? (Tôi thực sự không thể kiểm tra điều này vì tôi chưa cài đặt
Hệ thống tệp

1
Tôi nghi ngờ rằng hầu hết các trình điều khiển cho các hệ thống tệp trên Windows thực hiện dịch sang API hệ thống tệp 'kiểu Windows' để nó cho phép HĐH và các ứng dụng không di động hoạt động. Việc sử dụng thực tế sẽ phải dành cho một hệ điều hành hỗ trợ các hệ thống tập tin kỳ lạ và tuyệt vời mà không có mô hình cố định như Windows.
Bringer128

Ồ, và để trả lời câu hỏi khác của bạn - bạn sẽ có một phiên bản khác nhau FileSystemcho mỗi hệ thống tệp bạn xử lý.
Bringer128

31

Nếu mã của bạn không vượt qua ranh giới hệ thống tệp, tức là bạn chỉ làm việc với một hệ thống tệp, sau đó sử dụng java.io.File.separator.

Điều này sẽ, như đã giải thích, giúp bạn có dấu phân tách mặc định cho FS của bạn. Như Bringer128 đã giải thích,System.getProperty("file.separator") có thể được ghi đè thông qua các tùy chọn dòng lệnh và không phải là loại an toàn như java.io.File.separator.

Cái cuối cùng, java.nio.file.FileSystems.getDefault().getSeparator(); được giới thiệu trong Java 7, vì vậy bây giờ bạn có thể bỏ qua nó nếu bạn muốn mã của mình có thể di động trên các phiên bản Java cũ hơn.

Vì vậy, mỗi một trong số các tùy chọn này gần giống như các tùy chọn khác, nhưng không hoàn toàn. Chọn một trong những phù hợp với nhu cầu của bạn.


Được java.iophản đối ủng hộ java.nio?
Pacerier

13
@Pacerier: không, nó không bị phản đối. java.iolà một mức độ thấp hơn một chút java.nio, nhưng vẫn rất hữu ích và rộng rãi. Bạn có thể thấy sự khác biệt ở đây: blog.oracle.com/slc/entry/javanio_vs_javaio . niokhông thay thế io, nó mở rộng nó theo nhiều cách (và sử dụng iodưới mui xe).
darioo
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.