File.separator против FileSystem.getSeparator () против System.getProperty («file.separator»)?


136

Кажется, есть три идентичных способа получить независимый от платформы «разделитель файлов» независимо от платформы:

Как мы решаем, когда использовать какой?

Есть ли разница между ними?


Разве вы не получаете здесь зависимый от платформы разделитель файлов? Просто в независимой от платформы усадьбе.
Steinybot

@ Стейни, да, обновлено.
Pacerier

Типичный вопрос Java имеет по крайней мере 3 или более ответов
Stimpson Cat

Ответы:


142

System.getProperties()может быть переопределено вызовами System.setProperty(String key, String value)или параметрами командной строки-Dfile.separator=/

File.separator получает разделитель для файловой системы по умолчанию.

FileSystems.getDefault() получает файловую систему по умолчанию.

FileSystem.getSeparator()получает символ-разделитель для файловой системы. Обратите внимание, что в качестве метода экземпляра вы можете использовать его для передачи в ваш код других файловых систем, отличных от заданных по умолчанию, в тех случаях, когда вам нужен код для работы с несколькими файловыми системами в одной JVM.


2
Круто = D Кстати, не могли бы вы подробнее рассказать о части «работа с несколькими файловыми системами»?
Pacerier

4
@Pacerier Теоретически, если бы я написал новую файловую систему (BringerFS) с символом-разделителем «:», и у вас был компьютер с 2 разделами, один в NTFS и один в BringerFS, эта функциональность позволила бы вам использовать оба (предполагая, что Я также написал провайдер файловой системы Java).
Bringer128

Я имею в виду, что это практически полезно, как, скажем, у кого-то было 2 раздела: одна Windows и одна UNIX, и он запускает мое приложение (на своем разделе Windows), может ли класс получить доступ к своей файловой системе UNIX? (Я не смог проверить это, потому что у меня не установлена ​​другая файловая система.)
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под капотом).
Дарио
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.