Je cherche un moyen d'obtenir une liste de fichiers correspondant à un modèle (pref regex) dans un répertoire donné.
J'ai trouvé un didacticiel en ligne qui utilise le paquetage commons-io d'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 cela ne fait que renvoyer une collection de base (Selon la documentation c'est une collection de Java.io.File
). Existe-t-il un moyen de renvoyer une collection générique de type sécurisé?
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);
}
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"));
Depuis Java 7, vous pouvez utiliser le package 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);
}
Le code suivant va créer une liste de fichiers basée sur la méthode accept de la méthode 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
}}));
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
}
}
Qu'en est-il d'un wrapper autour de votre code existant:
public Collection<File> getMatchingFiles( String directory, String extension ) {
return new ArrayList<File>()(
getAllFilesThatMatchFilenameExtension( directory, extension ) );
}
Je vais lancer un avertissement si. Si vous pouvez vivre avec cet avertissement, alors vous avez terminé.