29 votes

lister tous les fichiers des répertoires et sous-répertoires en Java

Quel serait le moyen le plus rapide de lister les noms des fichiers de plus de 1000 répertoires et sous-répertoires ?

EDIT ; Le code que j'utilise actuellement est le suivant

import java.io.File;

public class DirectoryReader {

  static int spc_count=-1;

  static void Process(File aFile) {
    spc_count++;
    String spcs = "";
    for (int i = 0; i < spc_count; i++)
      spcs += " ";
    if(aFile.isFile())
      System.out.println(spcs + "[FILE] " + aFile.getName());
    else if (aFile.isDirectory()) {
      System.out.println(spcs + "[DIR] " + aFile.getName());
      File[] listOfFiles = aFile.listFiles();
      if(listOfFiles!=null) {
        for (int i = 0; i < listOfFiles.length; i++)
          Process(listOfFiles[i]);
      } else {
        System.out.println(spcs + " [ACCESS DENIED]");
      }
    }
    spc_count--;
  }

  public static void main(String[] args) {
    String nam = "D:/";
    File aFile = new File(nam);
    Process(aFile);
  }

}

0 votes

Qu'entendez-vous par "le plus rapide" ? Le plus simple à coder, le plus performant sur un certain système d'exploitation, ou le plus performant pour certaines structures de répertoire ?

0 votes

Dans mon cas, il s'agit d'être rapide sur WinXP et le plus simple possible.

0 votes

Upvoting parce que c'est un cas d'utilisation courant et que cela m'a certainement aidé.

34voto

Aksel Willgert Points 3791

Comme cette réponse apparaît en tête de google, j'ajoute une solution java 7 nio pour lister tous les fichiers et répertoires, cela prend environ 80% de temps en moins sur mon système.

try {
    Path startPath = Paths.get("c:/");
    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir,
                BasicFileAttributes attrs) {
            System.out.println("Dir: " + dir.toString());
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            System.out.println("File: " + file.toString());    
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException e) {
            return FileVisitResult.CONTINUE;
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}

9voto

Romain Hippeau Points 16175

Le goulot d'étranglement sera toutes les entrées/sorties de fichiers que vous devez effectuer, l'optimisation de votre Java ne montrera pas de réelles améliorations.

5voto

Alexander Pogrebnyak Points 24964

La seule amélioration consiste à se débarrasser de static spc_count et passer spcs en tant que paramètre du processus.

public static void main(String[] args) {
  String nam = "D:/";
  File aFile = new File(nam);
  Process("", aFile);
}

Et lors d'un appel récursif, faites

static void Process( String spcs, File aFile) {
  ...
  Process(spcs + " ", listOfFiles[i]);
  ...
}

De cette manière, vous pouvez appeler cette méthode à partir de plusieurs fils d'exécution.

0 votes

Merci pour le conseil @Alexander Pogrebnyak

4voto

Powerlord Points 43989

Jusqu'à ce que Java 7 introduise le nouveau java.nio.file (comme DirectoryStream ), je crains que ce que vous avez déjà ne soit le plus rapide.

4voto

Peter Points 470

Si vous êtes ouvert à l'utilisation d'une bibliothèque tierce, jetez un coup d'œil à javaxt-core . Il comprend une recherche récursive multithread dans les répertoires qui devrait être plus rapide que l'itération dans un répertoire à la fois. Il y a quelques exemples ici :

http://www.javaxt.com/javaxt-core/io/Directory/Recursive_Directory_Search

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X