与FileNameExtensionFilter一起使用File.listFiles

我想要获取目录中具有特定扩展名的文件列表。 在API(Java 6)中,我看到了一个File.listFiles(FileFilter)方法。

由于我需要一个特定的扩展名,我创build了一个FileNameExtensionFilter 。 但是,当我用这个listFiles时,我得到一个编译错误。 我认为,因为FileNameExtensionFilter implements FileFilter ,我应该能够做到这一点。 代码如下:

 FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt"); String dir = "/users/blah/dirname"; File f[] = (new File(dir)).listFiles(filter); 

最后一行显示编译错误:

Filetypes的方法listFiles(FileNameFilter)不适用于FileNameExtensionFiltertypes的参数

我正在尝试使用listFiles(FileFilter) ,而不是listFiles(FileNameFilter) 。 为什么编译器不能识别这个?

这工作,如果我写我自己的扩展filter扩展FileFilter 。 我宁愿使用FileNameExtensionFilter比写我自己的。 我究竟做错了什么?

FileNameExtensionFilter类用于在JFileChooser使用Swing 。

尝试使用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"); } }); 

是否有一个特定的原因,你想使用FileNameExtensionFilter ? 我知道这个作品..

 private File[] getNewTextFiles() { return dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".txt"); } }); } 

Java 8中的单行语法:

 File[] txts = pdfTestDir.listFiles( (dir, name) -> { return name.toLowerCase().endsWith(".txt"); } ); 

Duh …. listFiles需要java.io.FileFilter。 FileNameExtensionFilter扩展了javax.swing.filechooser.FileFilter。 我通过实现java.io.FileFilter的一个实例解决了我的问题

编辑:我确实使用了类似@ cFreiner的答案。 我试图使用Java API方法,而不是写我自己的实现,这就是为什么我要使用FileNameExtensionFilter。 我在我的应用程序中有很多FileChooser,并使用FileNameExtensionFilters,我错误地认为它也扩展了java.io.FileFilter。

这里是我很快做的东西,它应该比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"}); 

使用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);