File.separator vs FileSystem.getSeparator () проти System.getProperty ("file.separator")?


136

Здається, є три однакових способи незалежно від платформи "роздільник файлів" залежно від платформи:

Як ми вирішуємо, коли використовувати який?

Чи є навіть різниця між ними?


Ви насправді не отримуєте тут платформовий роздільник файлів? Просто в садибі, незалежній від платформи.
steinybot

@Steiny, так, оновлено.
Pacerier

Типовий Java-питання має щонайменше 3 або більше відповідей
Стімпсон-Кіт

Відповіді:


142

System.getProperties()може бути перекрито викликами до System.setProperty(String key, String value)параметрів командного рядка або з ним-Dfile.separator=/

File.separator отримує роздільник для файлової системи за замовчуванням.

FileSystems.getDefault() отримує вам файлову систему за замовчуванням.

FileSystem.getSeparator()отримує вам символ роздільника для файлової системи. Зауважте, що як метод екземпляра ви можете використовувати це для передачі різних файлових систем у ваш код, відмінний від за замовчуванням, у випадках, коли ваш код потрібен для роботи в декількох файлових системах в одному JVM.


2
Cool = D Btw, ви могли б детальніше розглянути деталь щодо "роботи декількох файлових систем"?
Пейс’єр

4
@Pacerier Теоретично, якби я написав нову файлову систему (BringerFS), яка мала розділовий символ ":", і у вас була машина з двома розділами, один в NTFS і один в BringerFS, ця функціональність дозволила б використовувати обидва (якщо припустити Я також написав провайдера файлової системи Java).
Bringer128

Я маю на увазі практично це корисно, скажімо, хтось мав 2 розділи, один Windows і один UNIX, і він запускає мою програму (на своєму розділі Windows), чи клас може отримати доступ до його файлової системи UNIX? (Я справді не міг перевірити це, бо не встановлено іншої FileSystem.)
Pacerier

1
Я підозрюю, що більшість драйверів для файлових систем у Windows виконують переклад на API файлової системи «у стилі Windows», щоб він міг працювати з ОС та портативними програмами. Практичне використання повинно бути для ОС, яка підтримує дивні та чудові файлові системи без фіксованої парадигми, як Windows.
Bringer128

О, і щоб відповісти на ваше інше питання - у вас був би інший FileSystemпримірник для кожної файлової системи, з якою ви працювали.
Bringer128

31

Якщо ваш код не перетинає межі файлової системи, тобто ви просто працюєте з однією файловою системою, тоді використовуйте java.io.File.separator.

Це, як було пояснено, отримає роздільник за замовчуванням для вашого FS. Як пояснив Bringer128, System.getProperty("file.separator")його можна змінити за допомогою параметрів командного рядка і не є таким безпечним, як тип java.io.File.separator.

Остання java.nio.file.FileSystems.getDefault().getSeparator();була представлена ​​в Java 7, тож ви можете ігнорувати її зараз, якщо хочете, щоб ваш код був переносним для старих версій Java.

Отже, кожен із цих варіантів майже такий самий, як і інші, але не зовсім. Виберіть той, який відповідає вашим потребам.


Чи java.ioзастаріла на користь java.nio?
Pacerier

13
@Pacerier: ні, це не застаріло. java.ioдещо нижчий рівень, ніж java.nio, але все ще дуже і широко корисний. Ви можете побачити відмінності тут: blogs.oracle.com/slc/entry/javanio_vs_javaio . nioне замінює io, поширює його декількома способами (і використовує ioпід кришкою).
darioo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.