将 File.listFiles 与 FileNameExtensionFilter 结合使用

发布于 2024-11-02 12:38:14 字数 797 浏览 8 评论 0原文

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

由于我需要特定的扩展名,因此我创建了一个 FileNameExtensionFilter。但是,当我使用 listFiles 时,出现编译错误。我认为既然 FileNameExtensionFilter 实现了 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 而不是自己编写。我做错了什么?

I would like to get a list of files with a specific extension in a directory. In the API (Java 6), I see a method File.listFiles(FileFilter) which would do this.

Since I need a specific extension, I created a FileNameExtensionFilter. However I get a compilation error when I use listFiles with this. I assumed that since FileNameExtensionFilter implements FileFilter, I should be able to do this. Code follows:

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

The last line shows a compilation error:

method listFiles(FileNameFilter) in type File is not applicable for arguments of type FileNameExtensionFilter

I am trying to use listFiles(FileFilter), not listFiles(FileNameFilter). Why does the compiler not recognize this?

This works if I write my own extension filter extending FileFilter. I would rather use FileNameExtensionFilter than write my own. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

护你周全 2024-11-09 12:38:14

FileNameExtensionFilter 类旨在供 SwingJFileChooser

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

The FileNameExtensionFilter class is intended for Swing to be used in a JFileChooser.

Try using a FilenameFilter instead. For example:

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");
    }
});
冰葑 2024-11-09 12:38:14

java 8 语法中的一行:

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

One-liner in java 8 syntax:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
み零 2024-11-09 12:38:14

您想要使用 FileNameExtensionFilter 有什么具体原因吗?我知道这有效..

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

Is there a specific reason you want to use FileNameExtensionFilter? I know this works..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}
红尘作伴 2024-11-09 12:38:14

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

With java lambdas (available since java 8) you can simply convert javax.swing.filechooser.FileFilter to java.io.FileFilter in one line.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
末骤雨初歇 2024-11-09 12:38:14

这是我刚刚快速制作的东西,它的性能应该比 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"});

Here's something I quickly just made and it should perform far better than 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;
    }
}

Here's an example for various images formats.

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
怕倦 2024-11-09 12:38:14

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

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

Duh.... listFiles requires java.io.FileFilter. FileNameExtensionFilter extends javax.swing.filechooser.FileFilter. I solved my problem by implementing an instance of java.io.FileFilter

Edit: I did use something similar to @cFreiner's answer. I was trying to use a Java API method instead of writing my own implementation which is why I was trying to use FileNameExtensionFilter. I have many FileChoosers in my application and have used FileNameExtensionFilters for that and I mistakenly assumed that it was also extending java.io.FileFilter.

鱼忆七猫命九 2024-11-09 12:38:14

还有 DirectoryStream

import java.nio.file.DirectoryStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
//import java.io.File;


Path path = Paths.get("foo/whereever");
// or if you still have a File-Object 'f':
// Path path = f.toPath();

try{
  Files.newDirectoryStream(path, "*.txt").forEach(System.out::println);
}catch(IOException e){}

或者如果想做更复杂的事情

...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.txt")) 
  for (Path entry: stream) {
    System.out.println(entry);
    //do something with entry 
  }
}catch(Exception e){
  e.printStackTrace();
}

Theres also DirectoryStream

import java.nio.file.DirectoryStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
//import java.io.File;


Path path = Paths.get("foo/whereever");
// or if you still have a File-Object 'f':
// Path path = f.toPath();

try{
  Files.newDirectoryStream(path, "*.txt").forEach(System.out::println);
}catch(IOException e){}

Or if want to do something more complex

...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.txt")) 
  for (Path entry: stream) {
    System.out.println(entry);
    //do something with entry 
  }
}catch(Exception e){
  e.printStackTrace();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文