我已经使这个方法通过并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求并返回数组List中的所有文件。
public static ArrayList<File> listFiles(File dir, FileFilter filter) {
ArrayList<File> files = new ArrayList<File>();
if (filter == null)
files = listFiles(dir, files);
else
files = listFiles(dir, filter, files);
return files;
}
private static ArrayList<File> listFiles(File dir, ArrayList<File> files, FileFilter filter) {
if (!dir.isDirectory() || !dir.exists())
return null;
for (File file : dir.listFiles()) {
System.out.println(file);
if (filter.accept(file))
files.add(file);
listFiles(file, filter, files);
}
return files;
}
但出于某种原因,它会多次返回一些文件......
(这是对top方法的调用,然后调用底部方法,我没有发布没有fileFilter的版本,因为它以完全相同的方式失败。如果你想知道区别那么只是忽略&#39; if(filter.accept(file))&#39;语句。
ArrayList<File> files = listFiles(new File("Notes"), new DirectoryFilter());
当我通过上述论证时,我得到了回报
Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File
Notes/JavaNotes/java/io/IOException
Notes/JavaNotes/java/util
Notes/JavaNotes/java/util/ArrayList
Notes/JavaNotes/javax
Notes/JavaNotes/javax/swing
Notes/JavaNotes/javax/swing/JFrame
Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File
最后四个文件是前四个文件的副本。它也是可预测的失败,只有前4行文件被添加两次(所以如果在该目录到达之前一行中只有2个文件,则只复制2个文件)。
directoryFilter是结果中没有实际.txt文件的原因。
答案 0 :(得分:2)
您的代码适用于我(在修复错误和清理之后)。
import java.io.*;
import java.util.*;
public class FileTree {
public static void main(String[] args) {
System.err.println(listFiles(new File(args[0]), new FileFilter() {
@Override public boolean accept(File pathname) {
return true;
}
}));
}
public static ArrayList<File> listFiles(File dir, FileFilter filter) {
ArrayList<File> files = new ArrayList<File>();
listFiles(dir, files, filter);
return files;
}
private static void listFiles(File dir, ArrayList<File> files, FileFilter filter) {
if (!dir.isDirectory()) {
return;
}
for (File file : dir.listFiles()) {
if (filter.accept(file)) {
files.add(file);
}
listFiles(file, files, filter);
}
}
}