Visión general de T1
Manipulación del sistema de ficheros con la API java.nio.file: rutas con Path/Files, recorrido de árboles de directorios, vigilancia de un directorio con WatchService, acceso secuencial y aleatorio, y una jerarquía de excepciones propia. Las cuatro actividades (A1.1–A1.4) forman parte de la ENTREGA 1 del curso (fase 1, «Ingesta/exportación de ficheros», según la tabla de fases de T0), con 8 horas asignadas en total.
El progreso se guarda en este navegador. Inicia sesión para sincronizarlo entre dispositivos.
✓Cómo usar esta guía
- Empieza por A1.1 · AlmacenExpedientes y avanza en orden: A1.2 (purga) reutiliza el recorrido de árboles que necesitas dominar antes, A1.3 (vigilante) es independiente, y A1.4 (excepciones) revisa y retoca el código de las tres anteriores.
- Cada página de actividad es autosuficiente: teoría, pasos, comandos/código y criterios de aceptación. No necesitas volver aquí para completarla.
- Marca las casillas conforme avanzas; el menú lateral y la barra de arriba se actualizan solas.
- Los bloques de código tienen botón Copiar.
WatchService, y una jerarquía de excepciones MultagalException que sustituye la propagación directa de IOException en las tres piezas anteriores.1Referencia rápida: formas de recorrer directorios
Transversal a A1.1 y A1.2 (fuente: apartado c). Elige la herramienta según cuánto control necesites durante el recorrido.
| Herramienta | Profundidad | Cuándo usarla |
|---|---|---|
DirectoryStream | Un nivel | Listar el contenido directo de un directorio, con filtro glob opcional al abrirlo |
Files.walk | Todo el árbol | Stream<Path> perezoso; requiere try-with-resources obligatorio porque mantiene descriptores de directorio abiertos |
PathMatcher | — | Compila el criterio glob una sola vez (FileSystem.getPathMatcher) en vez de recompilarlo en cada iteración |
Files.walkFileTree + FileVisitor | Todo el árbol | Control granular: distinguir entrada/salida de directorio, decidir si se desciende, borrado recursivo |
Files.delete sobre un directorio solo funciona si está vacío. En una purga: borra primero los ficheros, comprueba después si el directorio quedó vacío y bórralo entonces.PosixFileAttributes, Files.setPosixFilePermissions) no existen en Windows, que usa ACL. Comprueba FileSystems.getDefault().supportedFileAttributeViews() antes de depender de ellos.2Acceso secuencial vs. acceso aleatorio
Contexto general del tema (fuente: apartado e), sin actividad dedicada — puede aparecer en la defensa oral.
| Aspecto | Secuencial | Aleatorio |
|---|---|---|
| Orden de lectura | Principio a fin | Cualquier posición (seek) |
| API típica | BufferedReader, Stream<String>, Files.readString | RandomAccessFile, SeekableByteChannel |
| Coste de acceso | Proporcional a la posición | Constante |
| Caso de uso | Logs, exportaciones, ficheros de líneas variables | Registros de tamaño fijo, índices, fragmentos de ficheros muy grandes |
En Java nuevo se prefiere SeekableByteChannel (NIO.2, integrado con Path y buffers) sobre el clásico RandomAccessFile.
3Streaming de ficheros binarios grandes
Contexto general del tema (fuente: apartado g), sin actividad dedicada. Relevante si en A1.1 el archivado maneja adjuntos grandes.
Files.readAllBytes() carga el fichero entero en memoria: con ficheros grandes (vídeo, imágenes) o muchas peticiones simultáneas, esto agota memoria y puede lanzar OutOfMemoryError. La alternativa es procesar por bloques (streaming).
try (InputStream entrada = Files.newInputStream(origen);
OutputStream salida = Files.newOutputStream(destino)) {
byte[] buffer = new byte[8192];
int leidos;
while ((leidos = entrada.read(buffer)) != -1) {
salida.write(buffer, 0, leidos);
}
}
Tamaño de buffer recomendado: 8 KB (rango práctico 4–64 KB). BufferedInputStream/BufferedOutputStream complementan el buffer manual, no lo sustituyen. FileChannel.transferTo delega la copia en el sistema operativo (más rápido, pero no garantiza transferir todo en una sola llamada). En Spring, nunca uses MultipartFile.getBytes() con ficheros no acotados: carga todo en memoria igual que readAllBytes.
Contenido reestructurado a partir de accesodatos.netlify.app (Tema 1). Fuente única de la verdad para cualquier duda de detalle.