1. Filesclase

clase de archivos

Para trabajar con archivos, existe una elegante clase de utilidad: java.nio.file.Files. Tiene métodos para cada ocasión. Todos los métodos de esta clase son estáticos y operan en el objeto Path. Hay muchos métodos, por lo que consideraremos solo los más importantes:

Método Descripción
Path createFile(Path path)
Crea un nuevo archivo cuya ruta espath
Path createDirectory(Path path)
Crea un nuevo directorio
Path createDirectories(Path path)
Crea múltiples directorios
Path createTempFile(prefix, suffix)
Crea un archivo temporal
Path createTempDirectory(prefix)
Crea un directorio temporal
void delete(Path path)
Elimina un archivo o directorio si está vacío
Path copy(Path src, Path dest)
Copia un archivo
Path move(Path src, Path dest)
Mueve un archivo
boolean isDirectory(Path path)
Comprueba si la ruta es un directorio y no un archivo
boolean isRegularFile(Path path)
Comprueba si la ruta es un archivo y no un directorio
boolean exists(Path path)
Comprueba si existe un objeto en la ruta dada
long size(Path path)
Devuelve el tamaño del archivo
byte[] readAllBytes(Path path)
Devuelve todo el contenido de un archivo como una matriz de bytes
String readString(Path path)
Devuelve todo el contenido de un archivo como una cadena
List<String> readAllLines(Path path)
Devuelve todo el contenido de un archivo como una lista de cadenas
Path write(Path path, byte[])
Escribe una matriz de bytes en un archivo
Path writeString(Path path, String str)
Escribe una cadena en un archivo.
DirectoryStream<Path> newDirectoryStream(Path dir)
Devuelve una colección de archivos (y subdirectorios) del directorio dado

2. Creación de archivos y directorios

Los archivos y directorios son muy fáciles de crear. Vamos a convencernos con algunos ejemplos:

Código Nota
Files.createFile(Path.of("c:\\readme.txt"));
Crea un archivo
Files.createDirectory(Path.of("c:\\test"));
Crea un directorio
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Crea un directorio y todos los subdirectorios necesarios si no existen.

3. Copiar, mover y borrar

Copiar, mover y eliminar archivos es igual de fácil. Esto también se aplica a los directorios, pero deben estar vacíos.

Código Nota
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Copia un archivo
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Mueve y cambia el nombre de un archivo
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Elimina un archivo

4. Comprobar el tipo y la existencia de un archivo

Cuando tiene una ruta proporcionada por otra persona, desea saber si es un archivo o un directorio. Y, en general, ¿existe o no tal archivo/directorio?

Hay métodos especiales para esto también. También puede averiguar fácilmente la longitud de un archivo:

Código Nota
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Trabajar con contenidos de archivos

Finalmente, existe toda una serie de métodos que facilitan la lectura o escritura del contenido de un archivo. Ejemplo:

Código Descripción
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Lee el contenido del archivo como una lista de cadenas.

Mostrar las cadenas


6. Obtener el contenido de un directorio

El método más interesante aún permanece. Se utiliza para obtener archivos y subdirectorios en un directorio determinado.

Estamos hablando del newDirectoryStream()método, que devuelve un DirectoryStream<Path>objeto especial. Tiene un iterador (!) que puede usar para obtener todos los archivos y subdirectorios de un directorio determinado.

Esto es más fácil de lo que parece.

Código Descripción
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Obtenga un objeto con una lista de archivos
Recorra la lista de archivos

El DirectoryStream<Path>objeto tiene dos propiedades. Primero, tiene un iterador que devuelve las rutas de los archivos y podemos usar este objeto dentro de un for-eachbucle.

Y segundo, este objeto es un flujo de datos, por lo que debe cerrarse explícitamente usando el close()método o declararse dentro de un try-with-resourcesbloque.



7. Files.newInputStreammétodo

A partir de Java 5, las clases FileInputStreamy FileOutputStreamhan quedado obsoletas. Una de sus desventajas era que cuando se crean objetos de estas clases, los archivos se crean inmediatamente en el disco. Y todas las excepciones relacionadas con la creación de archivos podrían generarse potencialmente.

Más tarde esto fue reconocido como no la mejor decisión. En consecuencia, se recomienda utilizar los métodos de la java.nio.Filesclase de utilidad para crear objetos de archivo.

Aquí hay una comparación entre el enfoque anterior y el nuevo enfoque para crear archivos:

Antes
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
Después
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

Y hay un reemplazo similar para FileOutputStream:

Antes
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Después
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );