Использование File.listFiles с FileNameExtensionFilter
Я хотел бы получить список файлов с определенным расширением в каталоге. В 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) в типе Файл не применим для аргументов типа FileNameExtensionFilter
Я пытаюсь использовать listFiles(FileFilter)
, а не listFiles(FileNameFilter)
. Почему компилятор не распознает это?
Это работает, если я напишу свой собственный расширительный фильтр, расширяющий FileFilter
. Я предпочел бы использовать FileNameExtensionFilter
, чем писать свои собственные. Что я делаю неправильно?
Ответы
Ответ 1
Класс FileNameExtensionFilter
предназначен для Swing для использования в 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");
}
});
Ответ 2
Есть ли конкретная причина, по которой вы хотите использовать FileNameExtensionFilter
? Я знаю, что это работает.
private File[] getNewTextFiles() {
return dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
});
}
Ответ 3
Однострочный синтаксис в синтаксисе java 8:
File[] txts = pdfTestDir.listFiles(
(dir, name) -> {
return name.toLowerCase().endsWith(".txt");
}
);
Ответ 4
Duh.... listFiles требует java.io.FileFilter. FileNameExtensionFilter расширяет javax.swing.filechooser.FileFilter. Я решил свою проблему, выполнив экземпляр java.io.FileFilter
Изменить: я использовал что-то похожее на ответ @cFreiner. Я пытался использовать метод Java API вместо написания своей собственной реализации, поэтому я пытался использовать FileNameExtensionFilter. У меня много FileChoosers в моем приложении, и для этого я использовал FileNameExtensionFilters, и я ошибочно предположил, что он также расширяет java.io.FileFilter.
Ответ 5
Здесь что-то я быстро сделал, и он должен работать намного лучше, чем 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;
}
}
Вот пример для различных форматов изображений.
private static final ExtensionsFilter IMAGE_FILTER =
new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
Ответ 6
С 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);