我决定编写一个递归程序,将我的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();
}
}
}
答案 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; 试试吧。除了在我的情况下,当我尝试阅读时停止我无法访问,因此如果您没有以管理员身份运行,也需要检查。
答案 1 :(得分:0)
我不认为递归是一个问题。代码中的主要问题是您在每个级别执行的文件IO。在内存访问时,磁盘访问成本极高。如果您对代码进行了分析,那么您肯定会在磁盘IO中看到巨大的峰值。
所以,基本上你想减少磁盘I / O.为此,您可以使用内存有限大小的缓冲区,您可以在其中写入输出,当缓冲区已满时,将数据刷新到文件中。
然而,相当多的工作量。