Java: Como descobrir se o caminho é absoluta, independentemente do sistema operacional

StackOverflow https://stackoverflow.com/questions/1025285

  •  06-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira em Java para descobrir se o caminho fornecido é absoluto ou não, independentemente da plataforma o programa está sendo executado. Então, o que eu quero é provavelmente algo como o exemplo a seguir:

No Linux:

new File("/home/").isAbsolute() // Should return true.
new File("C:/My Documents").isAbsolute() // Should *also* return true.

No Windows:

new File("C:/Documents").isAbsolute() // Should return true.
new File("/home/").isAbsolute() // Should *also* return true.

Eu posso provavelmente código algo para se locomover com isso, mas eu só queria saber se alguém sabia um built-in de classe fornecido em Java para resolver este problema. Ou alguém já vêm este problema? E como você resolvê-lo?

Obrigado!

Foi útil?

Solução

Não.

Existem algumas classes FileSystem subjacentes (que é Java 7, mas eles existem antes dele também) que expõem isAbsolute (), mas eles não são públicos - para que você não deve usá-los, e mesmo se você fez o seu código seria cheio de reflexão lixo - e apenas os "corrigir" os mínimos estão incluídos no JRE, então você teria que código em torno deles de qualquer maneira.

Aqui estão as Java 7 implementações de isAbsolute (...) para você começar. Note-se que File.getPrefixLength () é um pacote-privadas.

Win32FileSystem :

public boolean isAbsolute(File f) 
{
        int pl = f.getPrefixLength();
        return (((pl == 2) && (f.getPath().charAt(0) == slash))
                || (pl == 3));
}

UnixFileSystem :

public boolean isAbsolute(File f) 
{
        return (f.getPrefixLength() != 0);
}

Outras dicas

Em Java 7:

new File(path).isAbsolute()

O meu crack para isso usando Apache FilenameUtil -

   public static boolean isAbsolute(final String path) {
      return FilenameUtils.getPrefixLength(path) != 0;
   }

Tecnicamente isso está voltando! Parente. O que é bom para os meus propósitos.

Acabei usando esse (em Java 6):

private static boolean testPath(String path) {
    int prefixLen = FilenameUtils.getPrefixLength(path);
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen))
        return true;
    else
        return false;
}

private static boolean testPathWin(String path, int prefixLen) {
    if (prefixLen == 3)
        return true;
    File f = new File(path);
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/'))
        return true;
    return false;
}

private static boolean testPathLinux(int prefixLen) {
    return (prefixLen != 0);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top