Método newDirectoryStream() de Java java.nio.file.Files

Java File Java java.nio.file.Files


java.nio.file.Files.newDirectoryStream()es un método muy práctico del paquete Java NIO (New I/O), utilizado para recorrer archivos y subdirectorios en un directorio. En comparación con el método tradicionaljava.io.Fileproporciona una forma más eficiente y flexible de recorrer directorios.

Definición del método

public static DirectoryStream<Path> newDirectoryStream(Path dir) throws IOException

public static DirectoryStream<Path> newDirectoryStream(Path dir, String glob) throws IOException

public static DirectoryStream<Path> newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) throws IOException

Descripción de parámetros

1. Parámetro básico

  • dir(Tipo Path): la ruta del directorio a abrir
  • Valor de retorno:DirectoryStream<Path>, que representa un flujo iterable de todas las entradas del directorio

2. Parámetro con filtro

  • glob(Tipo String): patrón glob para coincidir con nombres de archivo
  • filter(Tipo DirectoryStream.Filter<? super Path>): interfaz de filtro personalizado

Ejemplo de uso

1. Uso básico: recorrer un directorio

Ejemplo

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class DirectoryStreamExample {
    public static void main(String[] args) {
        Path dir = Paths.get("C:/example");
       
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
            for (Path file : stream) {
                System.out.println(file.getFileName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. Filtrar con el patrón Glob

Ejemplo

// Solo listar archivos .txt
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.txt")) {
    for (Path file : stream) {
        System.out.println(file.getFileName());
    }
}

3. Usar un filtro personalizado

Ejemplo

// Solo listar directorios
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
};

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
    for (Path file : stream) {
        System.out.println(file.getFileName());
    }
}

Características del método

1. Eficiencia

  • Utiliza las características de canal de NIO; comparado con el método tradicional,File.listFiles()es más eficiente.
  • Especialmente adecuado para manejar directorios que contienen una gran cantidad de archivos

2. Gestión de recursos

  • El valor devueltoDirectoryStreamimplementaAutoCloseablela interfaz
  • Se recomienda usar la sentencia try-with-resources para garantizar que los recursos se liberen correctamente

3. Seguridad de hilos

  • No es seguro para hilos y no se puede compartir entre varios hilos
  • Si se necesita procesamiento concurrente, se debe crear un flujo independiente para cada hilo

Precauciones

  1. Manejo de excepciones de E/S: debe manejarse o declararse que se lanzaIOException
  2. Liberación de recursos: se debe cerrar el flujo para evitar fugas de recursos
  3. Consideraciones de rendimiento: para directorios muy grandes, puede ser necesario considerar el procesamiento por lotes
  4. Enlaces simbólicos: de forma predeterminada, se siguen los enlaces simbólicos, a menos que se configure de otra manera

Comparación de alternativas

Método Ventajas Desventajas
Files.newDirectoryStream() Eficiente, admite filtrado No seguro para hilos
Files.list() (Java 8+) Devuelve un Stream, admite procesamiento paralelo Requiere Java 8+
File.listFiles() Simple y fácil de usar Rendimiento bajo

Mejores prácticas

  1. Usar siempre la sentencia try-with-resources
  2. Para lógica de filtrado compleja, usar filtros personalizados
  3. Al manejar directorios grandes, considera el procesamiento por lotes
  4. En entornos Java 8+,Files.list()puede ser una mejor opción

Preguntas frecuentes

Q1: ¿Cómo manejar archivos ocultos?

Se puede usar un filtro personalizado:

Ejemplo

DirectoryStream.Filter<Path> filter = entry -> !entry.getFileName().toString().startsWith(".");

Q2: ¿Cómo recorrer subdirectorios recursivamente?

newDirectoryStream()Por sí mismo no es recursivo; se puede combinar conFiles.walkFileTree()para implementar el recorrido recursivo.

Q3: ¿Cuáles son las recomendaciones de optimización de rendimiento?

  • Evitar operaciones costosas dentro del filtro
  • Para operaciones de solo lectura, considera usarFiles.list()y flujos paralelos.

A través de la explicación detallada de este artículo, ya deberías haber dominadoFiles.newDirectoryStream()el uso principal y las mejores prácticas del método. Este método es una herramienta muy práctica en las operaciones de archivos de Java; un uso adecuado puede mejorar significativamente la eficiencia del recorrido de directorios.

Java File Java java.nio.file.Files

Otras extensiones