File.separator vs FileSystem.getSeparator () vs System.getProperty ("file.separator")?

136

Tampaknya ada tiga cara yang identik untuk mendapatkan "pemisah file" yang bergantung pada platform secara independen platform:

Bagaimana kami memutuskan kapan akan menggunakan yang mana?

Apakah ada perbedaan di antara mereka?

Pacerier
sumber
Bukankah Anda benar-benar mendapatkan pemisah file yang bergantung pada platform di sini? Hanya di rumah tanpa platform.
steinybot
@Steiny, Ya, diperbarui.
Pacerier
Pertanyaan Java yang khas memiliki setidaknya 3 jawaban atau lebih
Stimpson Cat

Jawaban:

145

System.getProperties()dapat diganti dengan panggilan ke System.setProperty(String key, String value)atau dengan parameter baris perintah-Dfile.separator=/

File.separator mendapatkan pemisah untuk sistem file default.

FileSystems.getDefault() memberi Anda sistem file default.

FileSystem.getSeparator()memberi Anda karakter pemisah untuk sistem file. Perhatikan bahwa sebagai metode instance, Anda dapat menggunakan ini untuk meneruskan sistem file yang berbeda ke kode Anda selain dari default, dalam kasus di mana Anda memerlukan kode Anda untuk beroperasi pada beberapa sistem file dalam satu JVM.

Pembawa 128
sumber
2
Cool = D Btw bisakah Anda menguraikan bagian tentang "mengoperasikan banyak filesystem"?
Pacerier
4
@Pacerier Secara teori, jika saya menulis sistem file baru (BringerFS) yang memiliki karakter pemisah ":" dan Anda memiliki mesin dengan 2 partisi, satu di NTFS dan satu di BringerFS, fungsi ini akan memungkinkan Anda untuk menggunakan keduanya (dengan asumsi Saya juga menulis penyedia Java Filesystem).
Bringer128
Maksud saya praktis apakah itu berguna, seperti katakanlah seseorang memiliki 2 partisi, satu Windows dan satu UNIX, dan dia menjalankan aplikasi saya (pada partisi Windows-nya), apakah kelas tersebut dapat mengakses sistem file UNIX-nya? (Saya benar-benar tidak dapat menguji ini karena saya tidak memiliki FileSystem lain yang diinstal.)
Pacerier
1
Saya menduga bahwa sebagian besar driver untuk sistem file pada Windows melakukan terjemahan ke API sistem file 'gaya Windows' sehingga memungkinkan OS dan aplikasi non-portabel untuk bekerja. Penggunaan praktis haruslah untuk OS yang mendukung filesystem aneh dan indah tanpa paradigma tetap seperti Windows.
Bringer128
Oh, dan untuk menjawab pertanyaan Anda yang lain - Anda akan memiliki FileSystemcontoh yang berbeda untuk setiap sistem file yang Anda tangani.
Bringer128
31

Jika kode Anda tidak melewati batas sistem file, misalnya Anda hanya bekerja dengan satu sistem file, gunakan java.io.File.separator.

Ini akan, seperti yang dijelaskan, memberi Anda pemisah default untuk FS Anda. Seperti yang dijelaskan oleh Bringer128, System.getProperty("file.separator")dapat diganti melalui opsi baris perintah dan tidak seaman java.io.File.separator.

Yang terakhir, java.nio.file.FileSystems.getDefault().getSeparator();diperkenalkan di Java 7, jadi sebaiknya Anda mengabaikannya sekarang jika ingin kode Anda portabel di versi Java yang lebih lama.

Jadi, setiap opsi ini hampir sama dengan yang lain, tetapi tidak sepenuhnya. Pilih salah satu yang sesuai dengan kebutuhan Anda.

darioo
sumber
Apakah java.iousang demi java.nio?
Pacerier
13
@Pacerier: tidak, itu tidak usang. java.ioadalah tingkat yang sedikit lebih rendah daripada java.nio, tetapi masih sangat berguna dan luas. Anda dapat melihat perbedaannya di sini: blogs.oracle.com/slc/entry/javanio_vs_javaio . niotidak menggantikan io, ia memperpanjangnya dengan berbagai cara (dan digunakan di iobawah kap).
darioo