将File.listFiles与FileNameExtensionFilter一起使用

时间:2011-04-22 00:56:38

标签: java file filter java-6

我想获取目录中具有特定扩展名的文件列表。在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而不是写我自己的。我做错了什么?

6 个答案:

答案 0 :(得分:173)

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");
    }
});

答案 1 :(得分:27)

您是否有特定原因要使用FileNameExtensionFilter?我知道这有效..

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

答案 2 :(得分:21)

java 8语法中的单行:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));

答案 3 :(得分:1)

Duh .... listFiles需要java.io.FileFilter。 FileNameExtensionFilter扩展了javax.swing.filechooser.FileFilter。我通过实现java.io.FileFilter

的实例解决了我的问题

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

答案 4 :(得分:1)

这是我刚刚制作的东西,它应该比File.getName()表现得更好.adsndsWith(“。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"});

答案 5 :(得分:1)

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