Tu progreso en el tema

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.
Meta del temaAl terminar T1 tendrás: un componente de archivado de expedientes con rutas jerárquicas por fecha/provincia, un servicio de purga por prescripción que recorre el árbol de directorios, un vigilante del buzón de entrada basado en 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.

HerramientaProfundidadCuándo usarla
DirectoryStreamUn nivelListar el contenido directo de un directorio, con filtro glob opcional al abrirlo
Files.walkTodo el árbolStream<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 + FileVisitorTodo el árbolControl granular: distinguir entrada/salida de directorio, decidir si se desciende, borrado recursivo
Files.delete y directoriosFiles.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.
Permisos POSIXLos permisos POSIX (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.

AspectoSecuencialAleatorio
Orden de lecturaPrincipio a finCualquier posición (seek)
API típicaBufferedReader, Stream<String>, Files.readStringRandomAccessFile, SeekableByteChannel
Coste de accesoProporcional a la posiciónConstante
Caso de usoLogs, exportaciones, ficheros de líneas variablesRegistros 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).

java
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.