Commons-IO: DirectoryWalker
Published on 19/07/2009
2 min read
In category
jee
Commons-IO bzw. allg. Apache Commons ist eine schöne Ansammlung von nützlichen Bibliotheken und Funktionen. Darunter ist auch Commons-IO zu finden. Daraus will ich heute eine spezielle Lösung vorstellen. Hat man folgendes Problem: Möchte man einen Ordner, inklusive dessen Unterordner, nach bestimmten Dateien suchen und dann diese vielleicht nach Last-Modified sortiert, bietet Commons-IO eine Lösung an.
Um den/die Ordner durchzulaufen existiert ein DirectoryWalker. Um den abstrakten DirectoryWalker nutzen zu können könnte man z.B. eine folgende Implementierung nutzen:
public class TestDirectoryWalker extends DirectoryWalker {
public TestDirectoryWalker(IOFileFilter dirFilter, IOFileFilter fileFilter, int depth) {
super(dirFilter, fileFilter, depth);
}
/\*\*
\* This method sets the start directory and starts the DirectoryWalker.
\*/
public List search(File startDir) throws IOException {
List results = new ArrayList();
walk(startDir, results);
return results;
}
protected boolean handleDirectory(File directory, int depth, Collection results) {
// return true, cause every sub directory is allowed
return true;
}
protected void handleFile(File file, int depth, Collection results) {
// we want only the files with the name "abc.txt" in the
// subdirectories. This files will be inserted in the given
// result collection. This collection is the same as the
// created List in search(File)
String filename = file.getName();
if("abc.txt".equalsIgnoreCase(filename))
results.add(file);
}
}
Wie man sehen kann, kann man innerhalb weniger Zeilen einen DirectoryWalker schreiben, der alle Unterordner durchgeht und alle Dateien mit dem Titel "abc.txt" liefert. Die Nutzung ist genauso simpel:
TestDirectoryWalker idw = new TestDirectoryWalker(DirectoryFileFilter.DIRECTORY, FileFilterUtils.suffixFileFilter(".txt"), 3); String startDir = "D:/Temp/.../blub"; List files = null; try { // search the directory for the wanted files files = idw.search(new File(startDir)); System.out.println("Files: #" + files.size()); // sort the resulting files using the LastModifiedFileComparator System.out.println("first file: " + files.get(0)); Collections.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); System.out.println("oldest file: " + files.get(0)); } catch (IOException e) { e.printStackTrace(); }
Der Konstruktor TestDirectoryWalker(IOFileFilter, IOFileFilter, int) erwartet zwei Filter, einen für die Ordner und einen für die Dateien. Die Auswahl ist umfangreich, ansonsten kann man auch seinen eigenen schreiben.
Als letztes ist vielleicht noch die Zeile
Collections.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
interessant. LastModifiedFileComparator ist wie der Name schon andeutet, eine Klasse welches Comparator implementiert bzgl. File.lastModified(). Die Liste mit den gefundenen Dateien wird aufsteigend sortiert.
Innerhalb weniger Minuten kann man verschiedene Ordner nach speziellen Dateien suchen. Dank Apache Commons IO.