getpath - local path java
¿Cuál es la diferencia entre getPath(), getAbsolutePath() y getCanonicalPath() en Java? (6)
¿Cuál es la diferencia entre getPath()
, getAbsolutePath()
y getCanonicalPath()
en Java?
¿Y cuándo uso cada uno?
Considere estos nombres de archivo:
C:/temp/file.txt
: esta es una ruta, una ruta absoluta y una ruta canónica.
./file.txt
- Esta es una ruta. No es ni un camino absoluto ni un camino canónico.
C:/temp/myapp/bin/..//../file.txt
- Esta es una ruta y una ruta absoluta. No es un camino canónico.
Un camino canónico es siempre un camino absoluto.
La conversión de una ruta a una ruta canónica hace que sea absoluta (generalmente la tachuela en el directorio de trabajo actual, por ejemplo, ./file.txt
convierte en c:/temp/file.txt
). La ruta canónica de un archivo simplemente "purifica" la ruta, eliminando y resolviendo cosas como ../
y resolviendo 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());
Mientras que ambas rutas se refieren a la misma ubicación, la salida será bastante diferente:
C:/Windows
C:/Windows/System32/drivers
Creo 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 la propiedad del sistema java.io.tmpdir
, este método devolverá el valor "completo" nombre del archivo.
En breve:
-
getPath()
obtiene la cadena de ruta con la que se construyó el objetoFile
, 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 resulta en una ruta completamente 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 considera los medios canónicos para hacer referencia al sistema de archivos Objeto al que apunta.
Además, cada uno de estos tiene un equivalente de archivo que devuelve el objeto de File
correspondiente.
La mejor manera que he encontrado para tener una idea de cosas como esta es probándolas:
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) {}
}
}
Tu salida será algo como:
test/.././file.txt
C:/projects/sandbox/trunk/test/.././file.txt
C:/projects/sandbox/trunk/file.txt
Entonces, getPath()
te da la ruta basada en el objeto File, que puede o no ser relativa; getAbsolutePath()
te da una ruta absoluta al archivo; y getCanonicalPath()
te da la ruta absoluta única al archivo. Observe 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é intentando lograr, pero si estuviera tratando de ver si dos Files
apuntan al mismo archivo en el disco, podría comparar sus rutas canónicas. Sólo un ejemplo.
Lo importante para entenderlo es que la clase de File
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 las operaciones sobre este "nombre de ruta".
-
getPath()
la ruta de acceso con la que se creó el archivo (../foo.txt
) -
getAbsolutePath()
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()
intenta obtener una representación única de la ruta absoluta al archivo. Esto elimina la indirección de ".." y "." Referencias (/usr/foo.txt
).
Tenga en cuenta que digo intentos : al formar una ruta canónica, la máquina virtual puede lanzar una IOException
. Esto suele ocurrir porque está realizando algunas operaciones del sistema de archivos, cualquiera de las cuales podría fallar.
getPath()
devuelve la ruta utilizada para crear el objeto File
. Este valor de retorno no se modifica según la ubicación en la que se ejecuta (los resultados a continuación corresponden a las ventanas, 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 de ejecución o la unidad. Así que 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. Se resolverá la ubicación única que representa la ruta. Por lo tanto, si tiene "." S en la ruta, normalmente se eliminarán.
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.