Я хочу получить список файлов с определенным расширением в каталоге. В API (Java 6) я вижу метод, File.listFiles(FileFilter)
который бы это сделал.
Поскольку мне нужно конкретное расширение, я создал файл FileNameExtensionFilter
. Однако, когда я использую listFiles
это, я получаю ошибку компиляции . Я предположил, что с тех пор FileNameExtensionFilter implements FileFilter
я смогу это сделать. Код следующий:
FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);
Последняя строка показывает ошибку компиляции:
метод listFiles (FileNameFilter) в типе File не применяется для аргументов типа FileNameExtensionFilter
Я пытаюсь использовать listFiles(FileFilter)
, а не listFiles(FileNameFilter)
. Почему компилятор этого не распознает?
Это работает, если я напишу свой собственный фильтр расширения FileFilter
. Я лучше буду использовать, FileNameExtensionFilter
чем писать свой собственный. Что я делаю неправильно?
Ответы:
FileNameExtensionFilter
Класс предназначен для свинга , чтобы использовать вJFileChooser
.Попробуйте
FilenameFilter
вместо этого использовать. Например: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"); } });
источник
Однострочный синтаксис java 8:
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
источник
pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
Files.list(Paths.get("your/path")).filter(path -> path.toString().endsWith(".txt")).collect(Collectors.toList());
Есть ли конкретная причина, по которой вы хотите использовать
FileNameExtensionFilter
? Я знаю, что это работает ..private File[] getNewTextFiles() { return dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } }); }
источник
Да .... listFiles требует java.io.FileFilter. FileNameExtensionFilter расширяет javax.swing.filechooser.FileFilter. Я решил свою проблему, реализовав экземпляр java.io.FileFilter
Изменить: я использовал что-то похожее на ответ @ cFreiner. Я пытался использовать метод Java API вместо написания собственной реализации, поэтому я пытался использовать FileNameExtensionFilter. В моем приложении есть много FileChoosers, и я использовал для этого FileNameExtensionFilters, и я ошибочно предположил, что он также расширяет java.io.FileFilter.
источник
Вот кое-что, что я сделал быстро, и он должен работать намного лучше, чем File.getName () .ndsWith (". 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; } }
Вот пример для различных форматов изображений.
private static final ExtensionsFilter IMAGE_FILTER = new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
источник
С помощью java lambdas (доступных с java 8) вы можете просто преобразовать
javax.swing.filechooser.FileFilter
ихjava.io.FileFilter
в одну строку.javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg"); java.io.FileFilter ioFilter = file -> swingFilter.accept(file); new File("myDirectory").listFiles(ioFilter);
источник