Java: lista de archivos en un directorio

    Introducci贸n

    Muchas aplicaciones manejan archivos de alguna manera y la manipulaci贸n de archivos es uno de los conocimientos b谩sicos en cualquier lenguaje de programaci贸n.

    Para manipular archivos, necesitamos saber d贸nde est谩n ubicados. Tener una descripci贸n general de los archivos en un directorio es primordial si queremos lograr esto, especialmente si podemos realizar operaciones en ellos a trav茅s de la iteraci贸n. Hay varias formas de hacer esto en Java, que mostraremos a lo largo de este art铆culo.

    En aras de la simplicidad, todos los ejemplos se escribir谩n para el siguiente 谩rbol de archivos:

    Programming
    |-- minimax.c
    |-- super_hack.py
    |-- TODO.txt
    `-- CodingMusic
        |-- Girl Talk - All Day.mp3
        |-- Celldweller - Frozen.mp3
        |-- Lim Taylor - Isn't It Wonderful.mp3
        `-- Radiohead - Everything in Its Right Place.mp3
    

    File.list ()

    El m茅todo m谩s simple para listar los nombres de archivos y carpetas en un directorio dado, sin atravesar los subdirectorios, es el m茅todo auxiliar. .list(), que devuelve una matriz de Strings.

    Hacemos esto usando el .list() m茅todo en un File ejemplo:

    public class Pathnames {
    
        public static void main(String[] args) {
            // Creates an array in which we will store the names of files and directories
            String[] pathnames;
    
            // Creates a new File instance by converting the given pathname string
            // into an abstract pathname
            File f = new File("D:/Programming");
    
            // Populates the array with names of files and directories
            pathnames = f.list();
    
            // For each pathname in the pathnames array
            for (String pathname : pathnames) {
                // Print the names of files and directories
                System.out.println(pathname);
            }
        }
    }
    

    Usando un simple bucle for-each, iteramos a trav茅s de la matriz e imprimimos el Strings.

    CodingMusic
    minimax.c
    super_hack.py
    TODO.txt
    

    Con este enfoque, todos los elementos del CodingMusic directorio no se muestran, y una desventaja de este enfoque es que realmente no podemos hacer nada con los archivos en s铆. Solo estamos obteniendo sus nombres. Es 煤til cuando solo queremos echar un vistazo a los archivos al pie de la letra.

    FilenameFilter

    Otra cosa que podemos hacer con el .list() El m茅todo es crear un FilenameFilter para devolver solo los archivos que queremos:

    File f = new File("D:/Programming");
    
    // This filter will only include files ending with .py
    FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File f, String name) {
                return name.endsWith(".py");
            }
        };
    
    // This is how to apply the filter
    pathnames = f.list(filter);
    

    Ejecutar este fragmento de c贸digo producir铆a:

    super_hack.py
    

    File.listFiles ()

    Similar al m茅todo anterior, este se puede usar para devolver los nombres de archivos y directorios, pero esta vez los obtenemos como una matriz de File objetos, lo que nos da la posibilidad de manipularlos directamente:

    public class Pathnames {
        public static void main(String args[]) {
    
            // try-catch block to handle exceptions
            try {
                File f = new File("D:/Programming");
    
                FilenameFilter filter = new FilenameFilter() {
                    @Override
                    public boolean accept(File f, String name) {
                        // We want to find only .c files
                        return name.endsWith(".c");
                    }
                };
    
                // Note that this time we are using a File class as an array,
                // instead of String
                File[] files = f.listFiles(filter);
    
                // Get the names of the files by using the .getName() method
                for (int i = 0; i < files.length; i++) {
                    System.out.println(files[i].getName());
                }
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }
        }
    }
    

    Salida:

    minimax.c
    

    Ahora, profundicemos en el sistema de archivos usando la recursividad y algunos m茅todos m谩s para usar en el File objeto:

    public class ListFilesRecursively {
        public void listFiles(String startDir) {
            File dir = new File(startDir);
            File[] files = dir.listFiles();
    
            if (files != null && files.length > 0) {
                for (File file : files) {
                    // Check if the file is a directory
                    if (file.isDirectory()) {
                        // We will not print the directory name, just use it as a new
                        // starting point to list files from
                        listDirectory(file.getAbsolutePath());
                    } else {
                        // We can use .length() to get the file size
                        System.out.println(file.getName() + " (size in bytes: " + file.length()+")");
                    }
                }
            }
        }
        public static void main(String[] args) {
            ListFilesRecursively test = new ListFilesRecursively();
            String startDir = ("D:/Programming");
            test.listFiles(startDir);
        }
    }
    

    Salida:

    Girl Talk - All Day.mp3 (size in bytes: 8017524)
    Celldweller - Frozen.mp3 (size in bytes: 12651325)
    Lim Taylor - Isn't It Wonderful.mp3 (size in bytes: 6352489)
    Radiohead - Everything in Its Right Place.mp3 (size in bytes: 170876098)
    minimax.c (size in bytes: 20662)
    super_hack.py (size in bytes: 114401)
    TODO.txt (size in bytes: 998)
    

    Files.walk ()

    En Java 8 y posteriores podemos usar el java.nio.file.Files clase para poblar una Stream y util铆celo para recorrer archivos y directorios y, al mismo tiempo, recorrer de forma recursiva todos los subdirectorios.

    Tenga en cuenta que en este ejemplo usaremos expresiones Lambda:

    public class FilesWalk {
        public static void main(String[] args) {
            try (Stream<Path> walk = Files.walk(Paths.get("D:/Programming"))) {
                // We want to find only regular files
                List<String> result = walk.filter(Files::isRegularFile)
                        .map(x -> x.toString()).collect(Collectors.toList());
    
                result.forEach(System.out::println);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    Aqu铆, hemos poblado un Stream utilizando el .walk() m茅todo, pasando un Paths argumento. los Paths La clase consta de m茅todos est谩ticos que devuelven un Path basado en un URI de cadena y usando un Path, podemos localizar el archivo f谩cilmente.

    los Path, Paths, Files, y muchas otras clases pertenecen a la java.nio package, que se introdujo en Java 7 como una forma m谩s moderna de representar archivos sin bloqueo.

    Luego, utilizando el marco de colecciones, se genera una lista.

    Ejecutar este fragmento de c贸digo producir谩:

    D:ProgrammingCoding MusicRadiohead - Everything in Its Right Place.mp3
    D:ProgrammingCoding MusicLim Taylor - Isn't It Wonderful.mp3
    D:ProgrammingCoding MusicCelldweller - Frozen.mp3
    D:ProgrammingCoding MusicGirl Talk - All Day.mp3
    D:Programmingminimax.c
    D:Programmingsuper_hack.py
    D:ProgrammingTODO.txt
    

    Conclusi贸n

    El manejo de archivos de alguna manera es una tarea central para la mayor铆a de los lenguajes de programaci贸n, y esto incluye la capacidad de listar y encontrar archivos en el sistema de archivos. Para manipular archivos, necesitamos saber d贸nde est谩n ubicados. Tener una descripci贸n general de los archivos en un directorio es primordial si queremos lograr esto, especialmente si podemos realizar operaciones en ellos a trav茅s de la iteraci贸n.

    En este art铆culo mostramos varias formas diferentes en Java de listar archivos en el sistema de archivos, utilizando enfoques tanto lineales como recursivos.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *