Introducci贸n
Contenido
Verificar si existe un archivo o directorio es una operaci贸n simple e importante en muchas tareas. Antes de acceder a un archivo, debemos comprobar si existe para evitar una NullPointerException
. Lo mismo ocurre con los directorios.
Si bien algunas funciones pueden crear un nuevo archivo / directorio si el solicitado no existe, esto puede ser lo contrario de lo que queremos. Si deseamos agregar m谩s informaci贸n a un archivo existente y el m茅todo se ejecuta sin una advertencia, ya que crea el nuevo archivo que necesita, es posible que hayamos perdido algo de informaci贸n sin darnos cuenta.
Aqu铆, tenemos una estructura simple:
02/13/2020 11:53 AM <DIR> directory
02/13/2020 11:55 AM <SYMLINKD> directory_link [directory]
02/13/2020 11:53 AM 0 file.txt
02/13/2020 11:55 AM <SYMLINK> symlink.txt [file.txt]
Hay una file.txt
archivo y un symlink.txt
archivo. los symlink.txt
archivo es un enlace simb贸lico al file.txt
.
Del mismo modo, tenemos un directory
y un enlace simb贸lico a 茅l – directory_link
.
Compruebe si existe un archivo
Para trabajar con el Files
clase, necesitas estar familiarizado con la Path
clase. Files
solo acepta Path
, y no File
objetos.
Para los prop贸sitos del tutorial, definiremos un File
y Path
instancia para el file.txt
en nuestro directorio:
final static String location = "C:\file.txt";
Path path = Paths.get(location);
File file = new File(location);
Archivos.existe ()
Dicho esto, la primera forma en que podemos verificar si existe un archivo es a trav茅s del Files
clase:
// Check if file exists through a Path
System.out.println(Files.exists(path));
// Check if a file exists by converting File object to Path
System.out.println(Files.exists(file.toPath()));
Ejecutar este c贸digo nos dar谩:
true
true
Files.notExists ()
Quiz谩s se pregunte por qu茅 notExists()
el m茅todo existe en absoluto:
Si exists()
devoluciones true
, Eso significa que notExists()
deber铆a volver false
. Son plugins l贸gicos y A = !B
, 驴derecho?
Bueno, ah铆 es donde muchos se equivocan. Si Files.exists()
devoluciones false
, eso no tiene que significar que el archivo no existe.
Tambi茅n puede significar que la existencia del archivo no se puede verificar. En ese caso, ambos Files.exists()
y Files.notExists()
volver铆a false
, ya que Java no puede determinar si el archivo existe o no.
Esto suele ocurrir si tiene un archivo que est谩 bloqueado de una manera que Java no puede acceder a 茅l. Imagina que tuvi茅ramos un archivo que est谩 bloqueado en nuestro directorio. lockedFile.txt
:
Y si intent谩ramos verificar su existencia con:
System.out.println(Files.exists(path));
System.out.println(Files.notExists(path));
Ser铆amos recibidos con:
false
false
Existe, obviamente, pero Java no tiene permiso para confirmarlo en nuestro sistema, lo que da resultados contradictorios.
Files.isRegularFile ()
Adem谩s, podemos comprobar si el archivo es un archivo normal (false
si es un directorio) a trav茅s del isRegularFile()
m茅todo:
System.out.println(Files.isRegularFile(path));
La salida es:
true
File.isFile ()
En lugar de utilizar el Files
class, tambi茅n podemos realizar m茅todos en los propios objetos de archivo:
System.out.println(file.isFile());
Esto devuelve:
true
El archivo existe()
Similar a la opci贸n anterior, podemos ejecutar el exists()
m茅todo:
System.out.println(file.exists());
Y esto tambi茅n vuelve:
true
La diferencia entre estos dos es que el primero verifica si es un archivo y el otro verifica si existe. En diferentes circunstancias, arrojar铆an resultados diferentes.
Archivos bloqueados
Algo divertido de tener en cuenta es que si est谩 utilizando un File
para verificar la existencia, Java puede determinar si el archivo bloqueado de antes existe o no:
System.out.println(file.isFile());
System.out.println(file.exists());
Ejecutar este fragmento de c贸digo producir谩:
true
true
Con esto, es evidente que el archivo bloqueado se puede leer utilizando el File
clase en lugar de la Files
clase de ayudante.
Compruebe si existe un directorio
Los directorios son esencialmente archivos que pueden contener otros archivos. Es por eso que comprobar si un directorio es un archivo devolver谩 true
. Sin embargo, si est谩 comprobando si un directorio es un directorio (un tipo especial de archivo), obtendr谩 un resultado m谩s preciso.
Esta vez, cambiaremos nuestra ubicaci贸n a:
final static String location = "C:\directory";
Archivos.existe ()
Nuevamente, al igual que en el primer ejemplo, podemos verificar si existe a trav茅s de:
System.out.println(Files.exists(path));
La salida es:
true
Files.isDirectory ()
Si quisi茅ramos verificar si es espec铆ficamente un directorio, usar铆amos:
System.out.println(Files.isDirectory(path));
Y la salida es:
true
Nota: Si el directorio no existe, la isDirectory()
el m茅todo regresar谩 false
. Se debe a la forma en que se nombra el m茅todo. Lo que hace es: comprueba si el archivo existe y si es un directorio, no solo este 煤ltimo. Un archivo no puede ser un directorio si no existe, por lo tanto, false
es regresado.
Compruebe si el archivo es un enlace simb贸lico
Tambi茅n puede comprobar si un archivo es solo un enlace simb贸lico. En ese caso, usar铆a el Files
clase.
Cambiemos nuestra ubicaci贸n a:
final static String location = "C:\symlink.txt";
Files.isSymbolicLink ()
Como de costumbre, el Files
la clase acepta un Path
al archivo:
System.out.println(Files.isSymbolicLink(path));
Ejecutar esto producir铆a:
true
File.getCanonicalPath () frente a File.getAbsolutePath ()
Otra forma de verificar un enlace simb贸lico es comparar los resultados de la ruta can贸nica y la ruta absoluta del archivo. Si son diferentes, lo m谩s probable es que sea un enlace simb贸lico:
System.out.println(file.getCanonicalPath());
System.out.println(file.getAbsolutePath());
Como estamos buscando un enlace simb贸lico y sabemos que lo es, estos deber铆an devolver un resultado diferente: un symlink.txt
y file.txt
camino:
C:symlink.txt
C:symlink.txt
Sin embargo, este no es el caso aqu铆. Esto se debe al hecho de que el enlace simb贸lico se cre贸 en Windows con NTFS (New Technology File System). El enlace simb贸lico se cre贸 utilizando el mklink
comando en el CMD.
Compruebe si existe alguno
De los ejemplos anteriores, es evidente que el Files.exists()
el m茅todo regresar谩 true
para archivos y directorios existentes. Sin embargo, no funciona mejor cuando se trata de archivos bloqueados.
Por otro lado, el exists()
m茅todo del File
la clase tambi茅n volver谩 true
para archivos y directorios y puede leer el archivo bloqueado que el Files
la clase no puede.
Conclusi贸n
Verificar la existencia de archivos y directorios es la primera l铆nea de defensa contra archivos y directorios faltantes. Los diferentes enfoques tienen diferentes contratiempos y puede suponer que un m茅todo devolver谩 un resultado preciso, pero no lo har谩 debido a c贸mo funciona en segundo plano.
Ser consciente de qu茅 m茅todos devuelven qu茅 resultados y qu茅 circunstancias le permitir谩 evitar desagradables excepciones al manejar archivos.
Despu茅s de verificar si su archivo existe o no, es probable que desee leer y escribir archivos en Java.