我只需要从文件夹和子文件夹中读取.txt文件,然后将它们合并到一个文件中。 问题是当我设置过滤器时,它只在根文件夹中迭代。 这是代码:
public void walk( String path ) {
FilenameFilter textFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt");
}
};
File root = new File(path);
File[] list = root.listFiles(textFilter);
if (list == null) return;
for ( File f : list ) {
if ( f.isDirectory() ) {
walk( f.getAbsolutePath() );
System.out.println( "Dir:" + f.getAbsoluteFile() );
}
else {
System.out.println( "File:" + f.getAbsoluteFile()
);
}
}
}
和DirectoryChooser函数:
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle("Open Folder");
File selectedDirectory =
directoryChooser.showDialog(null);
if(selectedDirectory == null){
pathLabel.setText("No Directory selected");
}else{
pathLabel.setText(selectedDirectory.getAbsolutePath());
}
walk(selectedDirectory.getAbsolutePath());
}
我做错了什么?
答案 0 :(得分:3)
请考虑使用java.nio.Files
API。它有一些预定义的方法来遍历文件树:
ArrayList<>();
答案 1 :(得分:2)
您在循环之前进行过滤,并且您的过滤器会排除除txt文件之外的所有内容。这意味着list
不包含子目录!而是它只包含txt文件。因此,循环递归不能按预期工作,因为永远不会执行if(f.isDirectory())
分支。
以下是您尝试实现的一个小步行示例:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<File> results = new ArrayList<>();
walk(new File("/home/lwi/Documents"),results);
System.out.println(results.size());
}
public static void walk(File dir, List<File> accum) {
File[] files = dir.listFiles();
if (files == null)
return;
for (File f : files) {
if (f.isDirectory())
walk(f, accum);
else if (isTextFile(f))
accum.add(f);
}
}
private static boolean isTextFile(File f) {
return f.getName().toLowerCase().endsWith(".txt");
}
}