Método list() de Java java.nio.file.Files
java.nio.file.Files.list()Es un método de utilidad proporcionado en el paquete Java NIO (New I/O), utilizado para listar el contenido de un directorio. Este método devuelve unStream<Path>objeto que contiene todas las entradas (archivos y subdirectorios) del directorio especificado.
Definición del método
Parámetros del método
Parámetro dir
- Tipo:
java.nio.file.Path - Descripción: la ruta del directorio cuyo contenido se va a listar
- Notas:
- Si el parámetro no es un directorio, se lanzará
NotDirectoryException - La ruta debe existir; de lo contrario, se lanzará
NoSuchFileException - Si el programa no tiene permiso de lectura sobre el directorio, se lanzará
AccessDeniedException
- Si el parámetro no es un directorio, se lanzará
Valor de retorno
Stream
- Descripción: un flujo (stream) que contiene todas las entradas (archivos y subdirectorios) del directorio
- Propiedades:
- Los elementos del flujo son
Pathobjetos - El flujo está ordenado según el orden natural de las entradas del directorio (generalmente ordenadas por nombre)
- El flujo es de carga diferida (lazy); el contenido del directorio solo se lee realmente cuando se itera
- Es necesario cerrar correctamente el flujo para liberar recursos del sistema
- Los elementos del flujo son
Características del método
1. No recursivo
list()El método solo lista las entradas directamente ubicadas en el directorio especificado; no lista recursivamente el contenido de los subdirectorios.
2. No incluye entradas especiales
El flujo devuelto no incluye las entradas del directorio en sí (".") ni del directorio padre ("..").
3. Gestión de recursos
Dado que se devuelve un Stream, se recomienda utilizar la sentencia try-with-resources para asegurar que el flujo se cierre correctamente:
Ejemplo
stream.forEach(System.out::println);
}
Ejemplo de uso
Uso básico: listar el contenido de un directorio
Ejemplo
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Uso avanzado: filtrar archivos específicos
Ejemplo
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Convertir a otras colecciones
Ejemplo
List<Path> imageFiles = stream.collect(Collectors.toList());
// Procesar la lista de archivos recopilados
} catch (IOException e) {
e.printStackTrace();
}
Manejo de excepciones
Files.list()El método puede lanzar las siguientes excepciones:
- NotDirectoryException- Cuando la ruta no es un directorio
- NoSuchFileException- Cuando el directorio no existe
- SecurityException- Cuando no hay permiso para leer el directorio
- IOException- Cuando ocurre otro error de E/S
Consideraciones de rendimiento
- Carga diferida: el flujo es de carga diferida; el directorio solo se lee realmente cuando se ejecuta una operación terminal (como forEach)
- Consumo de recursos: para directorios con muchos archivos, usar un flujo puede evitar cargar todas las entradas en la memoria de una sola vez
- Procesamiento paralelo: se puede llamar a
parallel()método para implementar procesamiento paralelo, pero hay que prestar atención a los problemas de seguridad de hilos
Comparación con métodos similares
| Método | Tipo de retorno | Recursividad | Incluye entradas especiales | Observaciones |
|---|---|---|---|---|
Files.list() |
Stream<Path> |
no | no | Recomendado, respetuoso con los recursos |
File.listFiles() |
File[] |
no | no | Método IO tradicional |
Files.walk() |
Stream<Path> |
Sí | Sí | Lista recursivamente todo el contenido |
Files.newDirectoryStream() |
DirectoryStream<Path> |
no | no | Debe cerrarse manualmente |
Buenas prácticas
- Usar siempre try-with-resources: asegurar que el flujo se cierre correctamente
- Manejar excepciones: manejar adecuadamente la posible IOException
- Considerar el uso de filtros: filtrar lo antes posible las entradas innecesarias en las operaciones del flujo
- Evitar modificar el directorio: no modificar el contenido del directorio mientras se recorre
- Prestar atención a los enlaces simbólicos: por defecto se siguen los enlaces simbólicos, lo que puede provocar referencias circulares
Resumen
Files.list()El método es una forma moderna de manejar el contenido de directorios en Java NIO; proporciona todas las ventajas de la API de flujo, incluyendo ejecución diferida, operaciones encadenadas y capacidad de procesamiento paralelo. Para necesidades simples de listado de directorios, comparado con el métodoFile.listFiles()tradicional, el método es más flexible y eficiente.
Java java.nio.file.Files