读取文件并将它们合并为JavaFX

时间:2016-04-02 13:18:08

标签: java javafx

我只需要从文件夹和子文件夹中读取.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());
}

我做错了什么?

2 个答案:

答案 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");
    }

}