Chciałbym uzyskać listę plików z określonym rozszerzeniem w katalogu. W API (Java 6) widzę metodę, File.listFiles(FileFilter)
która by to zrobiła.
Ponieważ potrzebuję określonego rozszerzenia, utworzyłem plik FileNameExtensionFilter
. Jednak pojawia się błąd kompilacji, gdy używam listFiles
tego. Założyłem, że od tego czasu FileNameExtensionFilter implements FileFilter
powinienem być w stanie to zrobić. Kod następujący:
FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);
Ostatnia linia pokazuje błąd kompilacji:
method listFiles (FileNameFilter) w typie File nie ma zastosowania dla argumentów typu FileNameExtensionFilter
Próbuję użyć listFiles(FileFilter)
, nie listFiles(FileNameFilter)
. Dlaczego kompilator tego nie rozpoznaje?
Działa to, jeśli napiszę własny rozszerzający filtr rozszerzenia FileFilter
. Wolałbym używać FileNameExtensionFilter
niż pisać własne. Co ja robię źle?
Odpowiedzi:
FileNameExtensionFilter
Klasa jest przeznaczona dla Swing być stosowany wJFileChooser
.Spróbuj
FilenameFilter
zamiast tego użyć . Na przykład: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"); } });
źródło
Jednowierszowy w składni Java 8:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
źródło
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
Czy jest jakiś konkretny powód, dla którego chcesz użyć
FileNameExtensionFilter
? Wiem, że to działa ...private File[] getNewTextFiles() { return dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } }); }
źródło
Duh .... listFiles wymaga java.io.FileFilter. FileNameExtensionFilter rozszerza javax.swing.filechooser.FileFilter. Rozwiązałem swój problem, implementując instancję java.io.FileFilter
Edycja: użyłem czegoś podobnego do odpowiedzi @ cFreiner. Próbowałem użyć metody Java API zamiast pisać własną implementację, dlatego próbowałem użyć FileNameExtensionFilter. Mam wiele FileChoosers w mojej aplikacji i użyłem do tego FileNameExtensionFilters i błędnie założyłem, że rozszerzał również java.io.FileFilter.
źródło
Oto coś, co szybko stworzyłem i powinno działać znacznie lepiej niż File.getName (). EndWith (". 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; } }
Oto przykład dla różnych formatów obrazów.
private static final ExtensionsFilter IMAGE_FILTER = new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
źródło
Z lambdami java (dostępnymi od java 8) możesz po prostu przekonwertować
javax.swing.filechooser.FileFilter
jejava.io.FileFilter
w jednej linii.javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg"); java.io.FileFilter ioFilter = file -> swingFilter.accept(file); new File("myDirectory").listFiles(ioFilter);
źródło