Saltar al contenido

¿Cuál es la diferencia entre getPath(), getAbsolutePath() y getCanonicalPath() en Java?

Te damos la bienvenida a nuestra página, en este lugar encontrarás la respuesta a lo que estás buscando.

Solución:

Considere estos nombres de archivo:

C:tempfile.txt – Este es un camino, un camino absoluto y un camino canónico.

.file.txt – Este es un camino. No es ni un camino absoluto ni un camino canónico.

C:tempmyappbin..\..file.txt – Este es un camino y un camino absoluto. No es un camino canónico.

Una ruta canónica es siempre una ruta absoluta.

La conversión de una ruta a una ruta canónica lo hace absoluto (por lo general, se agrega al directorio de trabajo actual, por ejemplo, ./file.txt se convierte c:/temp/file.txt). La ruta canónica de un archivo simplemente “purifica” la ruta, eliminando y resolviendo cosas como .. y resolución de enlaces simbólicos (en Unixes).

Tenga en cuenta también el siguiente ejemplo con nio.Paths:

String canonical_path_string = "C:\Windows\System32\";
String absolute_path_string = "C:\Windows\System32\drivers\..\";

System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());

Si bien ambas rutas se refieren a la misma ubicación, el resultado será bastante diferente:

C:Windows
C:WindowsSystem32drivers

La mejor manera que he encontrado para tener una idea de cosas como esta es probarlas:

import java.io.File;
public class PathTesting 
    public static void main(String [] args) 
        File f = new File("test/.././file.txt");
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        try 
            System.out.println(f.getCanonicalPath());
        
        catch(Exception e) 
    

Su salida será algo como:

test...file.txt
C:projectssandboxtrunktest...file.txt
C:projectssandboxtrunkfile.txt

Entonces, getPath() le da la ruta basada en el objeto Archivo, que puede o no ser relativo; getAbsolutePath() le da una ruta absoluta al archivo; y getCanonicalPath() le da la ruta absoluta única al archivo. Tenga en cuenta que hay una gran cantidad de rutas absolutas que apuntan al mismo archivo, pero solo una ruta canónica.

¿Cuándo usar cada uno? Depende de lo que esté tratando de lograr, pero si estuviera tratando de ver si dos Files están apuntando al mismo archivo en el disco, puede comparar sus rutas canónicas. Solo un ejemplo.

En breve:

  • getPath() obtiene el camino string que el File con el que se construyó el objeto, y puede ser un directorio actual relativo.
  • getAbsolutePath() obtiene el camino string después de resolverlo con el directorio actual si es relativo, lo que da como resultado una ruta completa.
  • getCanonicalPath() obtiene el camino string después de resolver cualquier ruta relativa contra el directorio actual y elimina cualquier ruta relativa (. y ..), y cualquier enlace del sistema de archivos para devolver una ruta que el sistema de archivos considera el medio canónico para hacer referencia al objeto del sistema de archivos al que apunta.

Además, cada uno de estos tiene un archivo equivalente que devuelve el correspondiente File objeto.

Tenga en cuenta que, en mi opinión, Java se equivocó en la implementación de una ruta “absoluta”; realmente debería eliminar cualquier elemento de ruta relativa en una ruta absoluta. La forma canónica luego eliminaría cualquier enlace FS o uniones en la ruta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *