Java: come scoprire se il percorso è assoluto indipendentemente dal sistema operativo
-
06-07-2019 - |
Domanda
Esiste comunque in Java per scoprire se il percorso indicato è assoluto o no, indipendentemente dalla piattaforma su cui il programma è attualmente in esecuzione. Quindi, quello che voglio è probabilmente qualcosa come il seguente esempio:
Su Linux:
new File("/home/").isAbsolute() // Should return true.
new File("C:/My Documents").isAbsolute() // Should *also* return true.
Su Windows:
new File("C:/Documents").isAbsolute() // Should return true.
new File("/home/").isAbsolute() // Should *also* return true.
Probabilmente posso codificare qualcosa per ovviare a questo, ma volevo solo scoprire se qualcuno conosceva una classe integrata fornita in Java per risolvere questo problema. O qualcuno ha mai avuto questo problema? E come lo hai risolto?
Grazie!
Soluzione
No.
Ci sono alcune FileSystem sottostanti (che è Java 7, ma esistono anche prima) che espongono isAbsolute (), ma non sono pubbliche - quindi non dovresti usarle, e anche se lo facessi il tuo codice sarebbe pieno di ciarpame di riflessione - e solo il "corretto" I sistemi operativi sono inclusi in JRE, quindi dovresti comunque codificarli.
Ecco le implementazioni Java 7 di isAbsolute (...) per iniziare. Si noti che File.getPrefixLength () è pacchetto-privato.
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);
}
Altri suggerimenti
In Java 7:
new File(path).isAbsolute()
Il mio crack in questo usando Apache FilenameUtil -
public static boolean isAbsolute(final String path) {
return FilenameUtils.getPrefixLength(path) != 0;
}
Tecnicamente questo sta tornando! relativo. Il che va bene per i miei scopi.
Ho finito per usare questo (in 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);
}