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

136

Wydaje się, że istnieją trzy identyczne sposoby uzyskania niezależnego od platformy „separatora plików” zależnego od platformy:

Jak decydujemy, kiedy którego użyć?

Czy jest między nimi jakaś różnica?

Pacerier
źródło
Czy nie otrzymujesz tutaj separatora plików zależnego od platformy? Tylko w dworku niezależnym od platformy.
steinybot
@Steiny, tak, zaktualizowane.
Pacerier
Typowe pytanie dotyczące języka Java ma co najmniej 3 lub więcej odpowiedzi
Stimpson Cat

Odpowiedzi:

142

System.getProperties()można przesłonić wywołaniami do System.setProperty(String key, String value)lub parametrami wiersza poleceń-Dfile.separator=/

File.separator pobiera separator dla domyślnego systemu plików.

FileSystems.getDefault() dostaje domyślny system plików.

FileSystem.getSeparator()pobiera znak separatora dla systemu plików. Zwróć uwagę, że jako metody instancji możesz użyć tej metody do przekazywania różnych systemów plików do swojego kodu innych niż domyślny, w przypadkach, gdy kod ma działać na wielu systemach plików w jednej JVM.

Bringer128
źródło
2
Cool = D Przy okazji, czy mógłbyś rozwinąć część dotyczącą „obsługi wielu systemów plików”?
Pacerier
4
@Pacerier Teoretycznie, gdybym napisał nowy system plików (BringerFS), który miałby charakter separatora ":" i miałbyś maszynę z 2 partycjami, jedną w NTFS i jedną w BringerFS, ta funkcjonalność pozwoli ci używać obu (zakładając Napisałem również dostawcę systemu plików Java).
Bringer128,
Mam na myśli to, czy praktycznie jest to przydatne, jak powiedzmy, że ktoś miał 2 partycje, jeden Windows i jeden UNIX, i uruchamia moją aplikację (na swojej partycji Windows), czy klasa może uzyskać dostęp do jego systemu plików UNIX? (Naprawdę nie mogłem tego przetestować, ponieważ nie mam zainstalowanego innego systemu
plików
1
Podejrzewam, że większość sterowników dla systemów plików w systemie Windows wykonuje tłumaczenie na interfejs API systemu plików w stylu Windows, dzięki czemu system operacyjny i nieprzenośne aplikacje mogą działać. Praktyczne użycie musiałoby być dla systemu operacyjnego, który obsługuje dziwne i wspaniałe systemy plików bez ustalonego paradygmatu, takiego jak Windows.
Bringer128,
Aha, i odpowiadając na inne pytanie - miałbyś inną FileSysteminstancję dla każdego systemu plików, z którym miałeś do czynienia.
Bringer128,
31

Jeśli twój kod nie przekracza granic systemu plików, tj. Pracujesz tylko z jednym systemem plików, użyj java.io.File.separator.

To, jak wyjaśniono, da ci domyślny separator dla twojego FS. Jak wyjaśnił Bringer128, System.getProperty("file.separator")można go przesłonić opcjami wiersza poleceń i nie jest tak bezpieczny dla typu jak java.io.File.separator.

Ostatni z nich java.nio.file.FileSystems.getDefault().getSeparator();został wprowadzony w Javie 7, więc równie dobrze możesz go na razie zignorować, jeśli chcesz, aby Twój kod był przenośny w starszych wersjach Java.

Tak więc każda z tych opcji jest prawie taka sama jak inne, ale nie do końca. Wybierz taki, który odpowiada Twoim potrzebom.

darioo
źródło
Czy java.ioprzestarzałe na korzyść java.nio?
Pacerier,
13
@Pacerier: nie, nie jest przestarzały. java.iojest nieco niższy niż java.nio, ale nadal bardzo i szeroko przydatny. Możesz zobaczyć różnice tutaj: blogs.oracle.com/slc/entry/javanio_vs_javaio . nionie zastępuje io, rozciąga ją na wiele sposobów (i wykorzystuje iopod maską).
darioo