2010-06-10 6 views
2

Les codes suivants parcourent tous les répertoires et sous-répertoires et sortent uniquement les fichiers .java;lire les fichiers du répertoire et des fichiers de filtre à partir de Java

import java.io.File; 


public class DirectoryReader { 
    private static String extension = "none"; 
    private static String fileName; 

    public static void main(String[] args){ 
     String dir = "C:/tmp"; 
     File aFile = new File(dir); 
     ReadDirectory(aFile); 
    } 
    private static void ReadDirectory(File aFile) { 
     File[] listOfFiles = aFile.listFiles(); 
     if (aFile.isDirectory()) { 
      listOfFiles = aFile.listFiles(); 
      if(listOfFiles!=null) { 
       for(int i=0; i < listOfFiles.length; i++ ) { 
        if (listOfFiles[i].isFile()) { 

         fileName = listOfFiles[i].toString(); 
         int dotPos = fileName.lastIndexOf("."); 
         if (dotPos > 0) { 
          extension = fileName.substring(dotPos); 
         }      
         if (extension.equals(".java")) { 
         System.out.println("FILE:" + listOfFiles[i]); 
         } 
        }   
        if(listOfFiles[i].isDirectory()) { 
         ReadDirectory(listOfFiles[i]); 
        } 
       } 
      } 
     } 
    } 


} 

Est-ce efficace? Que pourrait-on faire pour augmenter la vitesse?

Toutes les idées sont les bienvenues.

+1

Il y a un bug: les fichiers sans extension seront traités comme s'ils avaient la dernière extension vue par le programme. Pas besoin d'appeler listFiles deux fois. Utilisez .getPath() et pas .toString() pour obtenir le chemin du fichier (même résultat, meilleure lisibilité) – unbeli

+0

@unbeli merci. – Adnan

Répondre

2

Mes commentaires:

  • bug possible: extension est pas réinitialisé. Pensez à ce qui se passe si vous ecounter file1.java et Thes file2

    Suggestion (sans . -character?): Mettre

    if (extension.equals(".java")) 
        System.out.println("FILE:" + listOfFiles[i]); 
    

    à l'intérieur du corps du if (dotPos > 0)

  • ReadDirectory est une méthode et devrait accourding to convention ont petite première lettre: readDirectory

  • Vous pourriez nettoyer le code d'un bit en utilisant le pour-chaque boucle:

    for(File f : listOfFiles) { 
        if (f.isFile()) { 
         // ... 
        }   
        if(f.isDirectory()) { 
         readDirectory(f); 
        } 
    } 
    
+0

merci, point pris. – Adnan

0

utilisation StringBuffer au lieu de System.out. La récursion est toujours plus lente mais plus concise.

3

En Java 7, je considère quelque chose comme:

Files.walkFileTree(aFile.toPath(), new SimpleFileVisitor<Path>() 
{ 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
    { 
    if(file.getFileName().endsWith(".java") 
    { 
     System.out.println("FILE:" + file); 
    } 
    return FileVisitResult.CONTINUE; 
    } 
}); 

Cela peut ne pas être plus rapide, mais je trouve plus facile à lire.

EDIT: J'ai supprimé l'exemple Java en cours. listFiles n'est pas récursif, vous pouvez donc l'utiliser, mais vous devrez utiliser votre propre récursivité. Vous aurez également besoin de deux appels listFiles (pour les fichiers et répertoires Java), ou vous aurez besoin d'un FileFilter qui correspond aux deux. Dans ce dernier cas, vous devrez vérifier chaque fichier du tableau retourné pour voir lequel il est.

+0

sympa, c'est vraiment plus lisible avec ça. Je vous remercie. – Adnan

+0

file.getName() doit être remplacé par file.getFileName(), car getName (index) attend en paramètre le nom de l'élément à renvoyer – magiccrafter

+0

@magiccrafter, merci, done. –

Questions connexes