在Java中递归列出文件的问题

时间:2017-09-22 15:51:58

标签: java file recursion

我决定编写一个递归程序,将我的C盘中的所有文件写入.txt文件,但速度非常慢。

我在网上看到递归很慢,但我无法想到任何其他方式。有什么办法可以优化吗?

编辑:将deepInspect方法更改为使用Stack而不是递归,这略微提高了性能。

这是代码

public class FileCount {

static long fCount = 0;

public static void main(String[] args) {
    System.out.println("Start....");
    long start = System.currentTimeMillis();
    File cDir = new File("C:\\");
    inspect(cDir);
    System.out.println("Operation took : " + (System.currentTimeMillis() - start) + " ms");
}

private static void inspect(File cDir) {
    for (File f : cDir.listFiles()) {
        deepInspect(f);
    }
}

private static void deepInspect(File f) {
    Stack<File> stack = new Stack<File>();
    stack.push(f);
    while (!stack.isEmpty()) {
        File current = stack.pop();
        if (current.listFiles() != null) {
            for (File file : current.listFiles()) {
                stack.push(file);
            }
        }
        writeData(current.getAbsolutePath());
    }
}

static FileWriter writer = null;

private static void writeData(String absolutePath) {
    if (writer == null)
        try {
            writer = new FileWriter("C:\\Collected\\data.txt");
        } catch (IOException e) {}
    try {
        writer.write(absolutePath);
        writer.write("\r\n");//nwline
        writer.write("Files : " + fCount);
        writer.write("\r\n");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

2 个答案:

答案 0 :(得分:0)

Java 8提供了一个流来处理所有文件。

Files.walk(Paths.get("/"))
    .filter(Files::isRegularFile)
    .forEach(System.out::println);

你可以添加&#34; parallel&#34;处理以提高绩效

Files.walk(Paths.get("/"))
    .parallel()
    .filter(Files::isRegularFile)
    .forEach(System.out::println);

我在linux下试过这个,所以你需要用&#34; C:&#34; 替换&#34; /&#34; 试试吧。除了在我的情况下,当我尝试阅读时停止我无法访问,因此如果您没有以管理员身份运行,也需要检查。

Check this out

答案 1 :(得分:0)

我不认为递归是一个问题。代码中的主要问题是您在每个级别执行的文件IO。在内存访问时,磁盘访问成本极高。如果您对代码进行了分析,那么您肯定会在磁盘IO中看到巨大的峰值。

所以,基本上你想减少磁盘I / O.为此,您可以使用内存有限大小的缓冲区,您可以在其中写入输出,当缓冲区已满时,将数据刷新到文件中。

然而,相当多的工作量。