Trabajar con ficheros en Java ha evolucionado mucho desde las primeras versiones. La API NIO.2 (java.nio.file), disponible desde Java 7, reemplaza al antiguo java.io.File y ofrece una interfaz mucho más expresiva y robusta.
Path y Files: la base de NIO.2
Path representa una ruta en el sistema de ficheros. Files proporciona operaciones estáticas sobre esa ruta:
import java.nio.file.*;
import java.io.IOException;
// Crear paths
Path ruta = Path.of("datos/fichero.txt"); // relativo
Path absoluto = Path.of("/home/usuario/fichero.txt"); // absoluto
Path unido = Path.of("datos").resolve("fichero.txt"); // combinar partes
// Información
System.out.println(ruta.getFileName()); // fichero.txt
System.out.println(ruta.getParent()); // datos
System.out.println(Files.exists(ruta)); // true/false
System.out.println(Files.isDirectory(ruta));
System.out.println(Files.size(ruta)); // bytes
Leer y escribir ficheros
Path path = Path.of("saludo.txt");
// Escribir texto
Files.writeString(path, "Hola, Java 21\n");
// Añadir al final
Files.writeString(path, "Segunda línea\n", StandardOpenOption.APPEND);
// Leer todo el contenido
String contenido = Files.readString(path);
System.out.println(contenido);
// Leer línea a línea
List lineas = Files.readAllLines(path);
for (String linea : lineas) {
System.out.println(linea);
}
// Ficheros grandes: leer como stream (no carga todo en memoria)
try (Stream stream = Files.lines(path)) {
long conJava = stream.filter(l -> l.contains("Java")).count();
System.out.println("Líneas con 'Java': " + conJava);
}
Crear, copiar, mover y borrar
// Crear directorios
Files.createDirectory(Path.of("nuevoDir"));
Files.createDirectories(Path.of("a/b/c")); // crea toda la cadena
// Copiar
Files.copy(Path.of("origen.txt"), Path.of("destino.txt"),
StandardCopyOption.REPLACE_EXISTING);
// Mover / renombrar
Files.move(Path.of("viejo.txt"), Path.of("nuevo.txt"),
StandardCopyOption.REPLACE_EXISTING);
// Borrar
Files.delete(Path.of("fichero.txt"));
Files.deleteIfExists(Path.of("quizas.txt")); // no lanza excepción si no existe
// Listar contenido de un directorio
try (DirectoryStream dir = Files.newDirectoryStream(Path.of("."))) {
for (Path entrada : dir) {
System.out.println(entrada.getFileName());
}
}
Ficheros temporales y propiedades
// Crear fichero temporal (se borra al salir si se usa con deleteOnExit)
Path temp = Files.createTempFile("prefijo_", ".tmp");
Files.writeString(temp, "datos temporales");
// ... usar el fichero ...
Files.delete(temp); // limpieza manual
// Atributos básicos
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Creado: " + attrs.creationTime());
System.out.println("Modificado: " + attrs.lastModifiedTime());
System.out.println("Es directorio: " + attrs.isDirectory());
Serialización moderna: Jackson / Gson
La serialización Java clásica (Serializable) tiene problemas de seguridad y compatibilidad. Para guardar objetos en disco o transmitir por red, el enfoque moderno es JSON o XML con librerías:
// Con Jackson (añadir dependencia en pom.xml o build.gradle)
// Objeto a JSON
ObjectMapper mapper = new ObjectMapper();
Persona persona = new Persona("Ana", 30);
String json = mapper.writeValueAsString(persona); // {"nombre":"Ana","edad":30}
Files.writeString(Path.of("persona.json"), json);
// JSON a objeto
String jsonLeido = Files.readString(Path.of("persona.json"));
Persona cargada = mapper.readValue(jsonLeido, Persona.class);
