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

136

Parece haver três maneiras idênticas de obter o "separador de arquivos" dependente da plataforma, independentemente da plataforma:

Como decidimos quando usar qual?

Existe alguma diferença entre eles?

Pacerier
fonte
Você não está realmente obtendo o separador de arquivos dependente da plataforma aqui? Apenas em uma mansão independente de plataforma.
9788205_05_03_03_03-de-
@ Steiny, Sim, atualizado.
Pacerier 12/11/14
Um típico Java Pergunta tem pelo menos 3 ou mais respostas
Stimpson Cat

Respostas:

142

System.getProperties()pode ser substituído por chamadas para System.setProperty(String key, String value)ou com parâmetros de linha de comando-Dfile.separator=/

File.separator obtém o separador para o sistema de arquivos padrão.

FileSystems.getDefault() fornece o sistema de arquivos padrão.

FileSystem.getSeparator()fornece o caractere separador para o sistema de arquivos. Observe que, como método de instância, você pode usá-lo para passar sistemas de arquivos diferentes para o seu código, exceto o padrão, nos casos em que você precisa que seu código opere em vários sistemas de arquivos na JVM.

Bringer128
fonte
2
Legal = D Entre você poderia elaborar sobre "operar vários sistemas de arquivos"?
Pacerier 10/11
4
@Pacerier Em teoria, se eu escrevesse um novo sistema de arquivos (BringerFS) que tivesse um caractere separador ":" e você tivesse uma máquina com 2 partições, uma no NTFS e outra no BringerFS, essa funcionalidade permitiria o uso de ambas (assumindo Eu também escrevi um provedor de sistema de arquivos Java).
Bringer128
Quero dizer, na prática, é útil, como dizer que alguém teve 2 partições, um Windows e um UNIX, e ele está executando meu aplicativo (na partição do Windows), é que a classe é capaz de acessar o sistema de arquivos UNIX? (Eu não poderia realmente testar isso porque eu não tenho outro sistema de arquivos instalado.)
Pacerier
1
Suspeito que a maioria dos drivers de sistemas de arquivos no Windows execute a conversão para uma API de sistema de arquivos 'estilo Windows', para permitir que o SO e aplicativos não portáteis funcionem. O uso prático teria que ser para um sistema operacional que suporte sistemas de arquivos estranhos e maravilhosos, sem um paradigma fixo como o Windows.
Bringer128
Ah, e para responder sua outra pergunta - você teria uma FileSysteminstância diferente para cada sistema de arquivos com o qual lidou.
Bringer128
31

Se o seu código não ultrapassar os limites do sistema de arquivos, ou seja, você está apenas trabalhando com um sistema de arquivos, use java.io.File.separator.

Como explicado, você obterá o separador padrão para o seu FS. Como Bringer128 explicou, System.getProperty("file.separator")pode ser substituído por opções de linha de comando e não é tão seguro quanto o tipo java.io.File.separator.

O último java.nio.file.FileSystems.getDefault().getSeparator();foi introduzido no Java 7, portanto, você pode ignorá-lo por enquanto, se quiser que seu código seja portátil nas versões mais antigas do Java.

Portanto, todas essas opções são quase as mesmas que as outras, mas não exatamente. Escolha um que atenda às suas necessidades.

darioo
fonte
É java.iodepreciado em favor de java.nio?
Pacerier 10/11/11
13
@ Pacerier: não, não está obsoleto. java.ioé um nível um pouco menor do que java.nio, mas ainda é muito e amplamente útil. Você pode ver as diferenças aqui: blogs.oracle.com/slc/entry/javanio_vs_javaio . nionão substitui io, estende-o de várias maneiras (e usa-o iosob o capô).
darioo 10/11/11