Java: come scoprire se il percorso è assoluto indipendentemente dal sistema operativo

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

  •  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!

È stato utile?

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.

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);
}

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top