88

我想获取目录中具有特定扩展名的文件列表。在 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);

最后一行显示编译错误:

File 类型的方法 listFiles(FileNameFilter) 不适用于 FileNameExtensionFilter 类型的参数

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

如果我编写自己的扩展过滤器扩展FileFilter. 我宁愿使用也不愿FileNameExtensionFilter自己写。我究竟做错了什么?

4

6 回答 6

188

该类FileNameExtensionFilter旨在让SwingJFileChooser.

尝试使用 aFilenameFilter代替。例如:

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");
    }
});
于 2011-04-22T01:01:52.487 回答
48

java 8 语法中的单行代码:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
于 2017-02-26T19:46:58.160 回答
30

您是否有特定的原因要使用FileNameExtensionFilter?我知道这行得通..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}
于 2011-04-22T01:06:07.667 回答
2

使用 java lambdas(从 java 8 开始可用),您可以简单地转换javax.swing.filechooser.FileFilterjava.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);
于 2017-06-01T09:22:03.597 回答
1

这是我快速制作的东西,它的性能应该比 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"});
于 2012-11-02T07:03:12.780 回答
1

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

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

于 2011-04-22T16:53:49.580 回答