Método newDirectoryStream() de 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, 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 archivofilter(Tipo DirectoryStream.Filter<? super Path>): interfaz de filtro personalizado
Ejemplo de uso
1. Uso básico: recorrer un directorio
Ejemplo
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
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.txt")) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
}
3. Usar un filtro personalizado
Ejemplo
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 devuelto
DirectoryStreamimplementaAutoCloseablela 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
- Manejo de excepciones de E/S: debe manejarse o declararse que se lanza
IOException - Liberación de recursos: se debe cerrar el flujo para evitar fugas de recursos
- Consideraciones de rendimiento: para directorios muy grandes, puede ser necesario considerar el procesamiento por lotes
- 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
- Usar siempre la sentencia try-with-resources
- Para lógica de filtrado compleja, usar filtros personalizados
- Al manejar directorios grandes, considera el procesamiento por lotes
- 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
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 usar
Files.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 java.nio.file.Files