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


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

¿Y cuándo uso cada uno?


517
2017-07-08 16:53


origen


Respuestas:


Considere estos nombres de archivo:

C:\temp\file.txt - Este es un camino, un camino absoluto y un camino canónico.

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

C:\temp\myapp\bin\..\\..\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 la hace absoluta (por lo general, se inserta en el 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 resolver enlaces simbólicos (en unixes).

También tenga en cuenta 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, la salida será bastante diferente:

C:\Windows
C:\Windows\System32\drivers

576
2017-07-08 17:11



La mejor manera que he encontrado para tener una idea de este tipo de cosas 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 así como:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

Asi que, getPath() le proporciona la ruta basada en el objeto Archivo, que puede ser relativa o no; getAbsolutePath() le da una ruta absoluta al archivo; y getCanonicalPath() le brinda la ruta de acceso 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ás tratando de lograr, pero si estuvieras tratando de ver si dos Files están apuntando al mismo archivo en el disco, podría comparar sus rutas canónicas. Solo un ejemplo.


111
2017-07-08 17:16



En breve:

  • getPath() obtiene la cadena de ruta que el File el objeto se construyó con, y puede ser un directorio actual relativo.
  • getAbsolutePath() obtiene la cadena de ruta después de resolverla contra el directorio actual si es relativa, lo que da como resultado una ruta totalmente calificada.
  • getCanonicalPath() obtiene la cadena de ruta 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 considere el medio canónico para hacer referencia al objeto del sistema de archivos al que apunta.

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


61
2017-07-08 17:11



getPath() devuelve la ruta utilizada para crear el File objeto. Este valor de retorno no cambia en función de la ubicación en la que se ejecuta (los resultados a continuación son para Windows, los separadores son obviamente diferentes en otros lugares)

File f1 = new File("/some/path");
String path = f1.getPath(); // will return "\some\path"

File dir = new File("/basedir");
File f2 = new File(dir, "/some/path");
path = f2.getPath(); // will return "\basedir\some\path"

File f3 = new File("./some/path");
path = f3.getPath(); // will return ".\some\path"

getAbsolutePath() resolverá la ruta en función de la ubicación o unidad de ejecución. Entonces si se ejecuta desde c:\test:

path = f1.getAbsolutePath(); // will return "c:\some\path"
path = f2.getAbsolutePath(); // will return "c:\basedir\some\path"
path = f3.getAbsolutePath(); // will return "c:\test\.\basedir\some\path"

getCanonicalPath() es dependiente del sistema Resolverá la ubicación única que representa la ruta. Entonces, si tiene algún "." S en la ruta, normalmente serán eliminados.

En cuanto a cuándo usarlos. Depende de lo que estás tratando de lograr. getPath() es útil para la portabilidad. getAbsolutePath() es útil para encontrar la ubicación del sistema de archivos, y getCanonicalPath() es particularmente útil para verificar si dos archivos son iguales.


34
2017-07-08 17:22



Lo más importante es que el File clase intenta representar una vista de lo que a Sun le gusta llamar "rutas de acceso jerárquicas" (básicamente una ruta como c:/foo.txt o /usr/muggins) Es por eso que creas archivos en términos de rutas. Las operaciones que está describiendo son todas operaciones sobre este "nombre de ruta".

  • getPath() busca la ruta con la que se creó el archivo (../foo.txt)
  • getAbsolutePath() busca la ruta con la que se creó el archivo, pero incluye información sobre el directorio actual si la ruta es relativa (/usr/bobstuff/../foo.txt)
  • getCanonicalPath()  intentos para obtener una representación única de la ruta absoluta al archivo. Esto elimina la indirección de ".." y "." referencias (/usr/foo.txt)

Nota que digo intentos - al formar una ruta canónica, la máquina virtual puede lanzar un IOException. Esto generalmente ocurre porque está realizando algunas operaciones del sistema de archivos, cualquiera de las cuales podría fallar.


18
2017-07-08 17:18



Encuentro que rara vez necesito usar getCanonicalPath() pero, si se le da un archivo con un nombre de archivo que está en formato DOS 8.3 en Windows, como el java.io.tmpdir La propiedad del sistema retorna, luego este método devolverá el nombre de archivo "completo".


3
2018-02-06 14:32