2010-01-20 3 views
63

Je cherche un moyen d'obtenir une liste de fichiers qui correspondent à un modèle (pref regex) dans un répertoire donné.Liste des fichiers dans un répertoire correspondant à un modèle en Java

Je l'ai trouvé un en ligne tutoriel qui utilise paquet de commons-io de apache avec le code suivant:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension) 
{ 
    File directory = new File(directoryName); 
    return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null); 
} 

Mais ce retourne juste une collection de base (Selon the docs c'est une collection de java.io.File). Y at-il un moyen de faire cela qui renvoie une collection générique de type sécurisé?

+0

pourquoi ne pas vous venez d'ajouter un casting? Je suppose que la collection de base est pour des raisons de compatibilité (avec une version plus ancienne de Java). Si vous voulez être absolument sûr, vous pouvez simplement créer une copie et ajouter les éléments après une vérification de type (les génériques ne font que compiler des vérifications de temps, de toute façon) – bertolami

+0

@bertolami, ne mettez pas de réponses dans les commentaires. :) –

+1

5 ans après le commentaire a été fait ... C'est une nécromancie puissante là @LimitedAtonement –

Répondre

96

Voir File#listFiles(FilenameFilter).

File dir = new File("."); 
File [] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".xml"); 
    } 
}); 

for (File xmlfile : files) { 
    System.out.println(xmlfile); 
} 
+1

Cela signifie que java lit tous les fichiers et rejette ceux qui ne correspondent pas. N'est-ce pas terriblement lent par rapport à toute commande système qui se filtre elle-même? – flaschenpost

+1

@flaschenpost Pas nécessairement, car les docs ne font aucune promesse sur la façon dont l'implémentation gère la mise en cache et d'autres détails liés aux performances. La limite majeure sur toute méthode de ce type est l'appel d'E/S sur le disque pour lire les métadonnées du fichier. Une commande système devrait toujours lire toutes les mêmes informations, donc c'est probablement assez proche pour que cela ne vaille pas la peine de s'inquiéter. La gestion en Java pur permet à quelqu'un d'autre de gérer les problèmes spécifiques à la plate-forme liés à l'obtention de ces métadonnées. – Morgen

+1

OK. Je suis juste habitué à tous les langages avec une méthode 'glob', et je m'attends à ce qu'il s'exécute dans l'implémentation du système de fichiers et soit environ 100x plus rapide (mais je n'ai pas vérifié cela). Mais je dois encore m'habituer au style java, où «rapide» signifie secondes au lieu de nanosecondes. ;-) – flaschenpost

14

Le code suivant va créer une liste de fichiers en fonction de la méthode de l'accepter FileNameFilter.

List<File> list = Arrays.asList(dir.listFiles(new FilenameFilter(){ 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.endsWith(".exe"); // or something else 
     }})); 
+0

Cela doit spécifier un bit de correspondance de modèle. – BobMcGee

0

Qu'en est-il un emballage autour de votre code existant:

public Collection<File> getMatchingFiles(String directory, String extension) { 
    return new ArrayList<File>()( 
     getAllFilesThatMatchFilenameExtension(directory, extension)); 
} 

Je jetterai un avertissement cependant. Si vous pouvez vivre avec cet avertissement, alors vous avez terminé.

12

Depuis java 7 vous pouvez le paquet java.nio pour obtenir le même résultat:

Path dir = ...; 
List<File> files = new ArrayList<>(); 
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) { 
    for (Path entry: stream) { 
     files.add(entry.toFile()); 
    } 
    return files; 
} catch (IOException x) { 
    throw new RuntimeException(String.format("error reading folder %s: %s", 
    dir, 
    x.getMessage()), 
    x); 
} 
25

Depuis Java 8 vous pouvez utiliser lambdas et obtenir un code plus court:

File dir = new File(xmlFilesDirectory); 
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml")); 
1
import java.io.BufferedReader; 

import java.io.File; 

import java.io.FileReader; 

import java.io.IOException; 

import java.util.Map; 

import java.util.Scanner; 

import java.util.TreeMap; 

public class CharCountFromAllFilesInFolder { 

    public static void main(String[] args)throws IOException { 

     try{ 

      //C:\Users\MD\Desktop\Test1 

      System.out.println("Enter Your FilePath:"); 

      Scanner sc = new Scanner(System.in); 

      Map<Character,Integer> hm = new TreeMap<Character, Integer>(); 

      String s1 = sc.nextLine(); 

      File file = new File(s1); 

      File[] filearr = file.listFiles(); 

      for (File file2 : filearr) { 
       System.out.println(file2.getName()); 
       FileReader fr = new FileReader(file2); 
       BufferedReader br = new BufferedReader(fr); 
       String s2 = br.readLine(); 
       for (int i = 0; i < s2.length(); i++) { 
        if(!hm.containsKey(s2.charAt(i))){ 
         hm.put(s2.charAt(i), 1); 
        }//if 
        else{ 
         hm.put(s2.charAt(i), hm.get(s2.charAt(i))+1); 
        }//else 

       }//for2 

       System.out.println("The Char Count: "+hm); 
      }//for1 

     }//try 
     catch(Exception e){ 
      System.out.println("Please Give Correct File Path:"); 
     }//catch 
    } 
} 
Questions connexes