Ich möchte eine Liste von Dateien mit einer bestimmten Erweiterung in einem Verzeichnis erhalten. In der API (Java 6) sehe ich eine Methode, File.listFiles(FileFilter)
die dies tun würde.
Da ich eine bestimmte Erweiterung benötige, habe ich eine erstellt FileNameExtensionFilter
. Ich erhalte jedoch einen Kompilierungsfehler, wenn ich damit verwende listFiles
. Ich ging davon aus, dass FileNameExtensionFilter implements FileFilter
ich dies seitdem tun sollte. Code folgt:
FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);
Die letzte Zeile zeigt einen Kompilierungsfehler:
Die Methode listFiles (FileNameFilter) vom Typ File gilt nicht für Argumente vom Typ FileNameExtensionFilter
Ich versuche zu benutzen listFiles(FileFilter)
, nicht listFiles(FileNameFilter)
. Warum erkennt der Compiler dies nicht?
Dies funktioniert, wenn ich meinen eigenen Erweiterungsfilter schreibe FileFilter
. Ich würde lieber FileNameExtensionFilter
meine eigenen verwenden als schreiben. Was mache ich falsch?
Antworten:
Die
FileNameExtensionFilter
Klasse ist für die Verwendung von Swing in a vorgesehenJFileChooser
.Versuchen Sie
FilenameFilter
stattdessen ein. Zum Beispiel:File dir = new File("/users/blah/dirname"); File[] files = dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } });
quelle
Einzeiler in Java 8-Syntax:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
quelle
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
Gibt es einen bestimmten Grund, den Sie verwenden möchten
FileNameExtensionFilter
? Ich weiß, dass das funktioniert ..private File[] getNewTextFiles() { return dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } }); }
quelle
Duh .... listFiles benötigt java.io.FileFilter. FileNameExtensionFilter erweitert javax.swing.filechooser.FileFilter. Ich habe mein Problem durch die Implementierung einer Instanz von java.io.FileFilter gelöst
Bearbeiten: Ich habe etwas Ähnliches wie die Antwort von @ cFreiner verwendet. Ich habe versucht, eine Java-API-Methode zu verwenden, anstatt meine eigene Implementierung zu schreiben, weshalb ich versucht habe, FileNameExtensionFilter zu verwenden. Ich habe viele FileChooser in meiner Anwendung und habe dafür FileNameExtensionFilters verwendet, und ich habe fälschlicherweise angenommen, dass es auch java.io.FileFilter erweitert.
quelle
Hier ist etwas, das ich schnell gemacht habe und das weitaus besser funktionieren sollte als File.getName (). EndsWith (". Xxxx");
import java.io.File; import java.io.FileFilter; public class ExtensionsFilter implements FileFilter { private char[][] extensions; private ExtensionsFilter(String[] extensions) { int length = extensions.length; this.extensions = new char[length][]; for (String s : extensions) { this.extensions[--length] = s.toCharArray(); } } @Override public boolean accept(File file) { char[] path = file.getPath().toCharArray(); for (char[] extension : extensions) { if (extension.length > path.length) { continue; } int pStart = path.length - 1; int eStart = extension.length - 1; boolean success = true; for (int i = 0; i <= eStart; i++) { if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20)) { success = false; break; } } if (success) return true; } return false; } }
Hier ist ein Beispiel für verschiedene Bildformate.
private static final ExtensionsFilter IMAGE_FILTER = new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
quelle
Mit Java lambdas (verfügbar seit Java - 8) können Sie einfach konvertieren
javax.swing.filechooser.FileFilter
zujava.io.FileFilter
in einer Zeile.javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg"); java.io.FileFilter ioFilter = file -> swingFilter.accept(file); new File("myDirectory").listFiles(ioFilter);
quelle