Java: Como descobrir se o caminho é absoluta, independentemente do sistema operacional
-
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!
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.
public boolean isAbsolute(File f)
{
int pl = f.getPrefixLength();
return (((pl == 2) && (f.getPath().charAt(0) == slash))
|| (pl == 3));
}
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);
}