web-dev-qa-db-fra.com

Comment File.listFiles dans l'ordre alphabétique?

J'ai le code ci-dessous:

class ListPageXMLFiles implements FileFilter {

        @Override
        public boolean accept(File pathname) {
                DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);

                String regex = ".*page_\\d{2}\\.xml";
                if(pathname.getAbsolutePath().matches(regex)) {
                        return true;
                }
                return false;
        }
}

public void loadPageTrees(String xml_dir_path) {
        ListPageXMLFiles filter_xml_files = new ListPageXMLFiles();
        File XMLDirectory = new File(xml_dir_path);
        for(File _xml_file : XMLDirectory.listFiles(filter_xml_files)) {
                loadPageTree(_xml_file);
        }
}

FileFilter fonctionne bien, mais listFiles() semble lister les fichiers par ordre alphabétique inverse. Existe-t-il un moyen rapide de dire à listFile() de répertorier les fichiers par ordre alphabétique?

87
Thunder Rabbit

La méthode listFiles, avec ou sans filtre, ne garantit aucun ordre.

Cependant, il retourne un tableau que vous pouvez trier avec Arrays.sort().

File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
    ...
}

Cela fonctionne car File est une classe comparable qui, par défaut, trie les noms de chemin lexicographiquement. Si vous souhaitez les trier différemment, vous pouvez définir votre propre comparateur.

Si vous préférez utiliser Streams:

Une approche plus moderne est la suivante. Pour imprimer les noms de tous les fichiers d’un répertoire donné, par ordre alphabétique, procédez comme suit:

Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)

Remplace le System.out::println avec tout ce que vous voulez faire avec les noms de fichiers. Si vous voulez seulement les noms de fichiers qui finissent par "xml" faites juste:

Files.list(Paths.get(dirName))
    .filter(s -> s.toString().endsWith(".xml"))
    .sorted()
    .forEach(System.out::println)

Encore une fois, remplacez l'impression par l'opération de traitement de votre choix.

207
Ray Toal

Je pense que la réponse précédente est la meilleure façon de le faire ici est un autre moyen simple. juste pour imprimer les résultats triés.

 String path="/tmp";
 String[] dirListing = null;
 File dir = new File(path);
 dirListing = dir.list();
 Arrays.sort(dirListing);
 System.out.println(Arrays.deepToString(dirListing));
2
grepit

Dans Java 8:

Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));

Ordre inverse:

Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));
1
Sergei Rodionov

Ceci est mon code:

        try {
            String folderPath = "../" + filePath.trim() + "/";
            logger.info("Path: " + folderPath);
            File folder = new File(folderPath);
            File[] listOfFiles = folder.listFiles();
            int length = listOfFiles.length;
            logger.info("So luong files: " + length);
            ArrayList<CdrFileBO> lstFile = new ArrayList< CdrFileBO>();

            if (listOfFiles != null && length > 0) {
                int count = 0;
                for (int i = 0; i < length; i++) {
                    if (listOfFiles[i].isFile()) {
                        lstFile.add(new CdrFileBO(listOfFiles[i]));
                    }
                }
                Collections.sort(lstFile);
                for (CdrFileBO bo : lstFile) {
                    //String newName = START_NAME + "_" + getSeq(SEQ_START) + "_" + DateSTR + ".s";
                    String newName = START_NAME + DateSTR + getSeq(SEQ_START) + ".DAT";
                    SEQ_START = SEQ_START + 1;
                    bo.getFile().renameTo(new File(folderPath + newName));
                    logger.info("newName: " + newName);
                    logger.info("Next file: " + getSeq(SEQ_START));
                }

            }
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
        }
0
Tru Nguyen