Java: cómo averiguar si la ruta es absoluta independientemente del sistema operativo

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

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna forma en Java para averiguar si la ruta dada es absoluta o no, independientemente de la plataforma que el programa esté ejecutando actualmente? Entonces, lo que quiero es probablemente algo como el siguiente ejemplo:

En Linux:

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

En Windows:

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

Probablemente pueda codificar algo para solucionar esto, pero solo quería saber si alguien conocía una clase incorporada en Java para resolver este problema. ¿O alguien ha tenido este problema? ¿Y cómo lo resolviste?

¡Gracias!

¿Fue útil?

Solución

No.

Hay algunas FileSystem subyacentes (eso es Java 7, pero también existen antes) que exponen isAbsolute (), pero no son públicos, por lo que no debería usarlos, e incluso si lo hiciera, su código estaría lleno de basura de reflexión: y solo el " correcto " Los OS están incluidos en el JRE, por lo que tendrías que codificarlos de todos modos.

Aquí están las implementaciones de Java 7 de isAbsolute (...) para comenzar. Tenga en cuenta que File.getPrefixLength () es un paquete privado.

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

Otros consejos

En Java 7:

new File(path).isAbsolute()

Mi crack en esto usando Apache FilenameUtil -

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

¡Técnicamente esto está volviendo! relativo. Lo cual está bien para mis propósitos.

Terminé usando esto (en 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top