0

我从 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

4 回答 4

4

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

描述是允许的null,所以如果你没有更好的东西放在那里,你可以使用

final FileNameExtensionFilter filter = new FileNameExtensionFilter(null, "pdf");
于 2013-10-04T21:38:16.393 回答
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. 使用它来发挥你的优势。

于 2013-10-04T21:47:07.390 回答
3

该类FileNameExtensionFilter旨在让SwingJFileChooser.

如果您不使用 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");
    }
});
于 2013-10-04T21:47:36.380 回答
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());
    }
}

另一种方法是FileFilter直接使用类似 a 的listFiles方法,例如...

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已经扫描了收集文件列表的整个目录。然后你做另一个循环来过滤它。

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

于 2013-10-04T21:43:04.913 回答