Bevor NIO.2 in Java 7 einen FileVisitor einführte, musste ein Verzeichnis inklusive aller Unterverzeichnisse selbst abgelaufen werden, um Dateien zu finden. Um das selbst zu realisieren helfen uns die Datenstrukturen und die list(…)-Methode von File.
Dabei sollen Dateien gefunden werden, deren Dateinamen auf regulären Ausdrücken »matchen«. Ein List-Objekt speichert bereits gefundene Dateien, und ein Stack merkt sich via Tiefensuche das aktuelle Verzeichnis, in dem der Algorithmus gerade steht. Anders als bei DeleteTree nutzt diese Implementierung keine rekursiven Methodenaufrufe:
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
public class FileFinder {
public static List<File> find( String start, String extensionPattern ) {
List<File> files = new ArrayList<>( 1024 );
Queue<File> dirs = Collections.asLifoQueue( new LinkedList<File>() );
File startdir = new File( start );
Pattern p = Pattern.compile( extensionPattern, Pattern.CASE_INSENSITIVE );
if ( startdir.isDirectory() )
dirs.add( startdir );
while ( dirs.size() > 0 )
for ( File file : dirs.remove().listFiles() )
if ( file.isDirectory() )
dirs.add( file );
else if ( p.matcher( file.getName() ).matches() )
files.add( file );
return files;
}
}
Eine Nutzung der Utility-Methode ist einfach, wie etwa die folgenden Zeilen zeigen, um Dokumente mit den Dateiendungen .gif und .jpg zu finden:
String path = new File( System.getProperty(„user.dir“) ).getParent();
System.out.println( „Suche im Pfad: “ + path );
List<File> files = FileFinder.find( path, „(.*\\.gif$)|(.*\\.jpg$)“ );
System.out.printf( „Fand %d Datei%s.%n“,
files.size(), files.size() == 1 ? „“ : „en“ );
for ( File f : files )
System.out.println( f.getAbsolutePath() );