Qual é a diferença entre usar File.separator
e normal /
em uma Java Path-String?
Em contraste com a \\
independência da plataforma com duas barras invertidas , parece não ser o motivo, pois as duas versões funcionam no Windows e no Unix.
public class SlashTest {
@Test
public void slash() throws Exception {
File file = new File("src/trials/SlashTest.java");
assertThat(file.exists(), is(true));
}
@Test
public void separator() throws Exception {
File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
assertThat(file.exists(), is(true));
}
}
Para reformular a pergunta, se /
funciona no Unix e no Windows, por que alguém deveria querer usá-lo File.separator
?
Respostas:
Com as bibliotecas Java para lidar com arquivos, você pode usar com segurança
/
(barra, não barra invertida) em todas as plataformas. O código da biblioteca manipula a tradução de coisas em caminhos específicos da plataforma internamente.Você pode querer usar
File.separator
na interface do usuário, no entanto, porque é melhor mostrar às pessoas o que fará sentido no sistema operacional e não o que faz sentido para o Java.Atualização : em cinco minutos de pesquisa, não consegui encontrar o comportamento "você sempre pode usar uma barra" documentado. Agora, tenho certeza de que já o vi documentado, mas, na falta de encontrar uma referência oficial (porque minha memória não é perfeita), eu continuaria usando,
File.separator
porque você sabe que isso funcionará.fonte
File
usa emFileSystem.normalize
todo o lugar para "normalizar" os caminhos recebidos por meio da API pública e praticamente qualquer coisa que lida com as cadeias de caminhos de arquivo (por exemploFileWriter(String)
) usaFile
nos bastidores.File
.Você usa
File.separator
porque um dia seu programa pode ser executado em uma plataforma desenvolvida em uma região longínqua, uma terra de coisas estranhas e pessoas estranhas, onde cavalos choram e vacas operam todos os elevadores. Nesse país, as pessoas tradicionalmente usam o caractere ":" como um separador de arquivos e, de maneira tão obediente, a JVM obedece a seus desejos.fonte
Embora o uso de File.separator para referenciar um nome de arquivo seja um exagero (para aqueles que imaginam países distantes, imagino que a implementação da JVM substitua a
/
por uma:
assim como o windows jvm a substitua por a\
).No entanto, às vezes você está obtendo a referência do arquivo, não a criando, e precisa analisá-la e, para poder fazer isso, precisa conhecer o separador na plataforma. O File.separator ajuda você a fazer isso.
fonte
OK, vamos inspecionar algum código.
File.java
linhas 428 a 435 emFile.<init>
:E vamos ler
fs/*(FileSystem)*/.fromURIPath()
documentos:Isso significa
FileSystem.fromURIPath()
que o pós-processamento no caminho do URI apenas no Windows e porque na próxima linha:Ele substitui cada '/' pelo dependente do sistema
seperatorChar
; você sempre pode ter certeza de que '/' é seguro em todos os sistemas operacionais.fonte
Bem, existem mais sistemas operacionais do que Unix e Windows (dispositivos portáteis, etc), e o Java é conhecido por sua portabilidade. A melhor prática é usá-lo, para que a JVM possa determinar qual é o melhor para esse SO.
fonte
:
separadores de estilo Mac já desapareceram há muito tempo. Parece que todos, menos o Windows, usam mais o padrão/
. E até o Windows parece lidar com barras bem agora. Experimentecd /windows/system
um sistema Windows 10 a partir da unidade principal do sistema. Enquanto você ainda deseja exibir caminhos usando o separador do sistema (para não confundir seus usuários), basta usar a barra invertida em/
qualquer outro lugar e ter certeza de que seu código funcionará em qualquer lugar em que você possa implantá-lo.Embora não faça muita diferença no caminho, ele faz no caminho de volta.
Claro que você pode usar '/' ou '\' no novo arquivo (caminho da string), mas File.getPath () fornecerá apenas um deles.
fonte
/
para frente ou para trás\\
. Mas em qualquer outro lugar, é melhor você usar a barra/
ou terá problemas.Tarde para a festa. Estou no Windows 10 com JDK 1.8 e Eclipse MARS 1.
Acho que
getClass().getClassLoader().getResourceAsStream("path/to/resource");
trabalha e
getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");
não funciona e
getClass().getClassLoader().getResourceAsStream("path\to\resource");
não funciona. Os dois últimos são equivalentes. Então ... Eu tenho um bom motivo para NÃO usar o File.separator.
fonte
getClass().getClassLoader().getResourceAsStream("path\to\resource");
, há uma tabulação (\t
) e um retorno de carro (\r
).File.separator
é uma barra invertida. É apenas em cadeias codificadas, onde é tratado como um caractere de escape, onde você precisa escapar da barra invertida. Se você armazenou o caractere em um arquivo de texto ou em um arquivochar
ouString
então não precisa escapá-lo pela segunda vez, pois ele já foi convertido no caractere de barra invertida esperado. Tente isso para ver por si mesmo:String backslash = "\\"; System.out.println("welcome" + backslash + "to" + backslash + "reality");
portabilidade pura e simples.
fonte
/
ou o separador do sistemaFile.separator
. Ambos parecem funcionar em todos os lugares. EmboraFile.separator
seja garantido que funcione em qualquer lugar, a barra simples/
também parece funcionar em qualquer lugar. Se não funcionar em algum lugar, eu adoraria ouvir sobre isso. Eu acredito que funcionará em todos os sistemas. No mínimo, ainda não encontrei nenhum lugar que/
não funcione (Mac OSX, Windows, * nix, Android, iOS - ainda não verifiquei os Macs OSX anteriores que usavam ":" como separador, embora OS / 2, NeXT ou qualquer outro sistema operacional realmente antigo).O "Java SE8 for Programmers" afirma que o Java vai lidar com eles. (p. 480, último parágrafo). O exemplo afirma que:
irá analisar muito bem. Anote o último separador (estilo Unix).
É brega e provavelmente suscetível a erros, mas é o que eles (Deitel e Deitel) afirmam.
Eu acho que a confusão para as pessoas, ao invés de Java, é motivo suficiente para não usar esse recurso (mis?).
fonte
Como os cavalheiros descreveram a diferença com detalhes variantes.
Gostaria de recomendar o uso da classe Apache Commons io api,
FilenameUtils
ao lidar com arquivos em um programa com a possibilidade de implantar em vários sistemas operacionais.fonte
O nome do caminho de um arquivo ou diretório é especificado usando as convenções de nomenclatura do sistema host. No entanto, a classe File define constantes dependentes da plataforma que podem ser usadas para manipular nomes de arquivos e diretórios de maneira independente da plataforma.
Files.seperator define o caractere ou string que separa o diretório e os componentes do arquivo em um nome de caminho. Este separador é '/', '\' ou ':' para Unix, Windows e Macintosh, respectivamente.
fonte
Se você estiver usando o Java 7, verifique Path.resolve () e Paths.get () .
fonte
O uso do File.separator fez o Ubuntu gerar arquivos com "\" no nome, em vez de diretórios. Talvez eu esteja sendo preguiçoso com a forma como estou criando arquivos (e diretórios) e possa ter evitado isso, independentemente, use "/" sempre para evitar arquivos com "\" no nome
fonte
Se você está tentando criar um arquivo a partir de um caminho pronto (salvo no banco de dados, por exemplo) usando o separador Linux, o que devo fazer?
Talvez apenas use o caminho para criar o arquivo:
Mas o Windows usa um separador diferente (
\
). Então, a alternativa é converter o separador de barra em plataforma independente? Gostar:Esse método
convertPathToPlatformIndependent
provavelmente terá algum tipo de divisão por "/" e se juntará ao File.separator.Bem, para mim, isso não é bom para uma linguagem independente de plataforma (certo?) E o Java já suporta o uso
/
no Windows ou Linux. Mas se você estiver trabalhando com caminhos e precisar se lembrar dessa conversão todas as vezes, isso será um pesadelo e você não terá nenhum ganho real para a aplicação no futuro (talvez no universo que o @Pointy descreveu).fonte