FileNameExtensionFilter不在循环中工作?

时间:2013-10-04 21:34:36

标签: java filter

我从BorisTheSpider那里得到了以下代码(谢谢他,循环工作完美):

final FileNameExtensionFilter filter = new FileNameExtensionFilter("pdf");
        final File path = new File (pathToFiles);
        for (final File child: path.listFiles()) {
            if (filter.accept(child)) {
            claimArrayList.add(child.getName());
            System.out.println(child.getName());
            }
        }

但是我得到了FileNameExtensionFilter的以下异常

Exception in thread "main" java.lang.IllegalArgumentException: Extensions must be non-null and not empty

然后我试了

i tried final FileNameExtensionFilter filter = new FileNameExtensionFilter(null, "pdf");

虽然它过滤了pdf文件,但它也允许使用子文件夹

当我尝试添加其他参数时,过滤器允许所有文件

 final FileNameExtensionFilter filter = new FileNameExtensionFilter("csv", "pdf");

4 个答案:

答案 0 :(得分:4)

您没有将正确的参数传递给constructor。具体来说,您缺少第一个参数description

允许说明为null,所以如果你没有更好的东西放在那里你可以使用

final FileNameExtensionFilter filter = new FileNameExtensionFilter(null, "pdf");

答案 1 :(得分:3)

,使用 Java 7 NIO 类:

public static void main(String[] args) throws Exception {
    final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf");
    try (DirectoryStream<Path> files = Files.newDirectoryStream(Paths.get("/"),
        new DirectoryStream.Filter<Path>() {
            @Override
            public boolean accept(Path entry) throws IOException {
                return pathMatcher.matches(entry); 
            }
        })
    ) {

        for (Path path : files) {
            System.out.println(path.toString());
        }
    }
} 

显然我没有回答这个问题,只是建议一个替代方案。请参阅所有其他答案,以正确使用FileNameExtensionFilter

Java 7 NIO包比旧版java.io具有更多实用性。使用它对您有利。

答案 2 :(得分:3)

FileNameExtensionFilter课程用于在Swing中使用JFileChooser

如果您不使用Swing,则FilenameFilter通常用于过滤文件。例如:

File dir = new File("/path/to/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".pdf");
    }
});

答案 3 :(得分:2)

FileNameExtensionFilter至少接受两个String参数,一个说明和一个过滤器可以匹配的扩展变量列表......

例如......

final FileNameExtensionFilter filter = new FileNameExtensionFilter("Portable Document Format (*.PDF)", "pdf");
final File path = new File(pathToFiles);
for (final File child : path.listFiles()) {
    if (filter.accept(child)) {
        claimArrayList.add(child.getName());
        System.out.println(child.getName());
    }
}

另一种方法是使用listFiles方法直接使用FileFilter之类的内容,例如......

FileFilter filter = new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.getName().toLowerCase().endsWith(".pdf");
    }
};
final File path = new File(pathToFiles);
File[] acceptableFiles = path.listFiles(filter);
claimArrayList.addAll(Arrays.asList(acceptableFiles));

虽然这两种方法都有效并且有其优点和缺点,但我(个人)更喜欢第二种方法的原因是listFiles已经扫描了收集文件列表的整个目录。然后你做另一个循环来过滤它。

第二种方法更有效,因为它过滤了生成列表。虽然性能可能在小目录列表中是有争议的,但当您开始处理包含数百个文件的目录时,您可以做的任何事情都会使它更有效率将有所帮助 - 恕我直言