Clase Files
Clase Files
1. Introducción a la clase Files
La clase Files es parte de la biblioteca java.nio.file y proporciona métodos estáticos para trabajar con archivos, directorios y otros sistemas de archivos. Su propósito es hacer más fácil y eficiente el manejo de archivos y directorios, y superar las limitaciones de la antigua API basada en clases como File.
| Tema | Descripción | Ejemplo |
|---|---|---|
| Copiar Archivos | Copiar archivos o directorios usando Files.copy(), con opciones para sobreescribir o no. |
Ejemplo de copiar un archivo con Files.copy() y la opción StandardCopyOption.REPLACE_EXISTING. |
| Mover Archivos | Mover archivos o directorios con Files.move(). |
Ejemplo de mover un archivo con Files.move() y la opción StandardCopyOption.REPLACE_EXISTING. |
| Eliminar Archivos y Directorios | Eliminar archivos con Files.delete() y directorios con Files.walk() (eliminación recursiva). |
Ejemplo de eliminar un archivo con Files.delete() y un directorio recursivamente con Files.walk(). |
| Crear Directorios | Crear directorios con Files.createDirectory() y directorios intermedios con Files.createDirectories(). |
Ejemplo de creación de directorios con Files.createDirectories(). |
| Modificar Atributos de Archivos | Modificar atributos como permisos y propietarios usando Files.setAttribute() y Files.getAttribute(). |
Ejemplo de cambiar permisos con Files.setPosixFilePermissions(). |
| Enlaces Simbólicos | Crear y eliminar enlaces simbólicos con Files.createSymbolicLink() y Files.delete(). |
Ejemplo de crear y eliminar un enlace simbólico con Files.createSymbolicLink() y Files.delete(). |
| Comparar Archivos | Comparar archivos utilizando Files.isSameFile() para verificar si dos archivos son iguales. |
Ejemplo de comparación de dos archivos con Files.isSameFile(). |
| Observación de Directorios (WatchService) | Monitorear cambios en directorios con WatchService para reaccionar a eventos como creación o modificación. |
Ejemplo de monitoreo de cambios en directorios con WatchService. |
Algunas de las operaciones avanzadas que puedes realizar con Files incluyen:
- Copiar y mover archivos y directorios.
- Eliminar archivos y directorios.
- Modificar atributos de archivos y directorios.
- Trabajar con enlaces simbólicos.
- Crear directorios y subdirectorios.
- Obtener información detallada sobre archivos y directorios.
- Comparar archivos y directorios.
- Leer y escribir archivos de manera más eficiente.
2. Operaciones Avanzadas con Files
2.1. Copiar y Mover Archivos y Directorios
Uno de los métodos más útiles de la clase Files es copy(), que te permite copiar archivos o directorios de forma fácil y eficiente. Además, puedes controlar el comportamiento en caso de que el archivo de destino ya exista.
Copiar archivos:
import java.nio.file.*;
import java.io.IOException;
public class CopiarArchivo {
public static void main(String[] args) {
Path origen = Paths.get("archivo_origen.txt");
Path destino = Paths.get("archivo_destino.txt");
try {
Files.copy(origen, destino, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Archivo copiado exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
En este ejemplo, el archivo archivo_origen.txt se copia a archivo_destino.txt. La opción StandardCopyOption.REPLACE_EXISTING asegura que, si el archivo de destino ya existe, se sobreescriba.
Mover archivos:
import java.nio.file.*;
import java.io.IOException;
public class MoverArchivo {
public static void main(String[] args) {
Path origen = Paths.get("archivo_origen.txt");
Path destino = Paths.get("directorio_destino/archivo_moved.txt");
try {
Files.move(origen, destino, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Archivo movido exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Aquí, el archivo se mueve desde archivo_origen.txt a un nuevo directorio directorio_destino. Al igual que con copy(), puedes usar StandardCopyOption.REPLACE_EXISTING para reemplazar el archivo de destino si ya existe.
2.2. Eliminar Archivos y Directorios
Para eliminar archivos, usamos el método delete(), que elimina un archivo o directorio vacío. Si deseas eliminar un directorio con contenido, necesitarás usar un enfoque recursivo o eliminar los archivos dentro del directorio antes de eliminar el directorio.
import java.nio.file.*;
import java.io.IOException;
public class EliminarArchivo {
public static void main(String[] args) {
Path archivo = Paths.get("archivo_a_eliminar.txt");
try {
Files.delete(archivo);
System.out.println("Archivo eliminado exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Para eliminar directorios no vacíos, puedes hacerlo de forma recursiva con un enfoque similar al siguiente:
import java.nio.file.*;
import java.io.IOException;
public class EliminarDirectorio {
public static void main(String[] args) {
Path directorio = Paths.get("directorio_a_eliminar");
try {
Files.walk(directorio) // Recorrer todos los archivos dentro del directorio
.sorted(Comparator.reverseOrder()) // Eliminar primero los archivos más profundos
.map(Path::toFile)
.forEach(File::delete); // Eliminar cada archivo
Files.delete(directorio); // Finalmente, eliminar el directorio vacío
System.out.println("Directorio y su contenido eliminados exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3. Crear Directorios
Puedes crear directorios con Files.createDirectory() o incluso crear directorios de manera recursiva usando Files.createDirectories(), que crea el directorio y todos los directorios intermedios si no existen.
import java.nio.file.*;
import java.io.IOException;
public class CrearDirectorio {
public static void main(String[] args) {
Path directorio = Paths.get("nuevo_directorio");
try {
Files.createDirectories(directorio);
System.out.println("Directorio creado exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
En este caso, si los directorios intermedios no existen, Files.createDirectories() los crea automáticamente.
2.4. Modificar Atributos de Archivos
Puedes leer y modificar los atributos de un archivo o directorio, como sus permisos, propietario, etc. Usando Files.getAttribute() o Files.setAttribute() puedes obtener o establecer atributos específicos de archivos.
Obtener atributos de un archivo:
import java.nio.file.*;
import java.io.IOException;
public class ObtenerAtributosArchivo {
public static void main(String[] args) {
Path archivo = Paths.get("archivo.txt");
try {
// Obtener el tamaño del archivo
long size = (long) Files.getAttribute(archivo, "size");
System.out.println("Tamaño del archivo: " + size + " bytes");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Cambiar permisos de archivo:
import java.nio.file.*;
import java.io.IOException;
public class ModificarPermisosArchivo {
public static void main(String[] args) {
Path archivo = Paths.get("archivo.txt");
try {
// Establecer permisos de solo lectura
Files.setPosixFilePermissions(archivo,
PosixFilePermissions.fromString("r--r--r--"));
System.out.println("Permisos modificados exitosamente.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.5. Trabajar con Enlaces Simbólicos
Con NIO.2 también puedes crear y eliminar enlaces simbólicos de manera sencilla. Los enlaces simbólicos son archivos que apuntan a otros archivos o directorios.
Crear un enlace simbólico:
import java.nio.file.*;
import java.io.IOException;
public class CrearEnlaceSimbolico {
public static void main(String[] args) {
Path original = Paths.get("archivo_original.txt");
Path enlace = Paths.get("enlace_simbólico.txt");
try {
Files.createSymbolicLink(enlace, original);
System.out.println("Enlace simbólico creado.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Eliminar un enlace simbólico:
import java.nio.file.*;
import java.io.IOException;
public class EliminarEnlaceSimbolico {
public static void main(String[] args) {
Path enlace = Paths.get("enlace_simbólico.txt");
try {
Files.delete(enlace);
System.out.println("Enlace simbólico eliminado.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.6. Comparar Archivos
Si necesitas verificar si dos archivos son iguales (por ejemplo, si tienen el mismo contenido), puedes usar Files.isSameFile() para comparar los archivos de forma eficiente.
import java.nio.file.*;
import java.io.IOException;
public class CompararArchivos {
public static void main(String[] args) {
Path archivo1 = Paths.get("archivo1.txt");
Path archivo2 = Paths.get("archivo2.txt");
try {
if (Files.isSameFile(archivo1, archivo2)) {
System.out.println("Los archivos son iguales.");
} else {
System.out.println("Los archivos son diferentes.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}