与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);