File.separator ou File.pathSeparator

519

Na Fileclasse há duas strings, separatore pathSeparator.

Qual é a diferença? Quando devo usar um sobre o outro?

icnhzabot
fonte
6
A nomeação é um pouco confusa, a rapidez com que algo assim é necessário é absolutamente terrível (cf. Perl). Veja os exemplos para pathSeparatorChar e separatorChar . Ou use os mnemônicos simples: o pathSeparator separa os caminhos.
Maaartinus 12/05
6
Tomar um minuto para imprimir ambos para a tela teria respondido a sua pergunta ...
Jean-François Corbett
13
Embora eu concorde geralmente, simplesmente imprimi-los em seu sistema não mostrará as variantes de outros sistemas operacionais.
precisa saber é o seguinte

Respostas:

680

Se você quer dizer File.separatore File.pathSeparatordepois:

  • File.pathSeparatoré usado para separar caminhos de arquivo individuais em uma lista de caminhos de arquivo. Considere no Windows a variável de ambiente PATH. Você usa a ;para separar os caminhos dos arquivos, como File.pathSeparatorseria o Windows ;.

  • File.separatoré um /ou \é usado para dividir o caminho para um arquivo específico. Por exemplo, no Windows, é \ouC:\Documents\Test

user489041
fonte
6
Parece que File.separatordeve ser File.fileSeparatorem relação aFile.pathSeparator
Eddy
1
@ Eddy Entendo o seu ponto, mas pode ser redundante, já que o nome da classe é File. Eu acho que a parte do arquivo está implícita. Mas quem sabe por que eles fizeram muito do que fizeram com Java.
usar o seguinte código
117

Você usa o separador ao criar um caminho de arquivo. Então, no unix, o separador é /. Então, se você quisesse construir o caminho unix /var/temp, faria assim:

String path = File.separator + "var"+ File.separator + "temp"

Você usa pathSeparatorquando está lidando com uma lista de arquivos como em um caminho de classe. Por exemplo, se seu aplicativo tomou uma lista de jars como argumento, a maneira padrão de formatar essa lista no unix é:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

Então, dada uma lista de arquivos, você faria algo assim:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);
Karthik Ramachandran
fonte
5
Se você está construindo um caminho * nix como /var/tempesse, é inútil usá- File.separatorlo, pois você já possui código dependente da plataforma. Também pode codificar o caminho.
Isapir
109

java.io.FileA classe contém quatro variáveis ​​separadoras estáticas. Para uma melhor compreensão, vamos entender com a ajuda de algum código

  1. separator: caractere padrão do separador de nomes dependente da plataforma como String. Para Windows, é '\' e para unix, é '/'
  2. separatorChar: Igual ao separador, mas é char
  3. pathSeparator: variável dependente da plataforma para separador de caminho. Por exemplo, lista variável de caminhos PATH ou CLASSPATH separados por ':' nos sistemas Unix e ';' no sistema Windows
  4. pathSeparatorChar: o mesmo que pathSeparator, mas é char

Observe que todas essas são variáveis ​​finais e dependem do sistema.

Aqui está o programa java para imprimir essas variáveis ​​separadoras. FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

Saída do programa acima no sistema Unix:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

Saída do programa no sistema Windows:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

Para tornar nossa plataforma de programa independente, sempre devemos usar esses separadores para criar o caminho do arquivo ou ler quaisquer variáveis ​​do sistema como PATH, CLASSPATH.

Aqui está o trecho de código que mostra como usar os separadores corretamente.

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");
foxt7ot
fonte
1
Observe que, em Java, o caractere de barra invertida é \\, porque uma única barra invertida é o caractere de escape de outras abreviações de caracteres especiais; portanto, a própria barra invertida é usada para escapar por si mesma. Os métodos retornados Stringe charretornados pelos métodos mencionados acima retornam a barra invertida corretamente formatada (se estiver no Windows).
Erik
novo arquivo ("tmp / abc.txt"); isso é correto para windows e linux, mas não é correto para unix new File ("tmp \\ abc.txt"); isso é problema apenas unix
DEV-Jacol