我从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");
答案 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
已经扫描了收集文件列表的整个目录。然后你做另一个循环来过滤它。
第二种方法更有效,因为它过滤了生成列表。虽然性能可能在小目录列表中是有争议的,但当您开始处理包含数百个文件的目录时,您可以做的任何事情都会使它更有效率将有所帮助 - 恕我直言