我应该首先收集文件然后执行任务还是应该在收集时执行任务?)

时间:2012-01-16 19:02:35

标签: java file io

我需要遍历给定文件夹(及其子文件夹)的所有文件,并在每个文件上执行某些操作。 我正在寻找一种方法来递归遍历所有文件并在Apache Commons Io中找到一个解决方案: FileUtils.iterateFiles 它返回一个迭代器。 我检查了它是如何实现的,并看到它遍历所有文件并将它们添加到集合中,然后返回集合的迭代器。 确定这就是它的作用。这就是我在寻找的东西:)

但后来我想 - 首先收集所有文件然后遍历所有文件并执行我想要的是否有效? 或者我应该而不是收集它们,只需在递归遍历中执行操作?

应该注意的是,我对文件的所需操作包括对它们的IO操作,这可能会失败..(可以通过两种方式处理..但只是注意以防我在想法中遗漏了一些内容) 此外,我正在遍历的文件夹和文件集可能达到400个文件夹或大约5000个文件,文件大小可能达到几千兆(再次,只是遍历文件但不相关因为我打算执行IO任务) )..

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:0)

你应该开始浏览文件系统,创建一个Runnable / Callable实现到你想对这些文件做什么,然后找到每个文件将它提交给ThreadPool(你可以从Executors类创建一个)。

在这种情况下,您应该使用固定的线程池,并且大小可能会有所不同,您应该进行基准测试,看看处理文件的线程数量如何影响性能。

答案 1 :(得分:0)

从磁盘读取内容既缓慢又昂贵。最好的方法是使用多线程,这样就不会浪费时间等待IO回放文件内容。一旦发送文件读取,读/写线程就会进入休眠状态一段时间,另一个线程将处理您需要执行的操作。一旦读/写线程被唤醒,它就会写入磁盘。

要回答您的问题,不可能一次加载所有文件(及其内容),并由于内存限制而继续处理它们。使用多线程一次处理几个文件。或者你可以使用mapreduce,取决于给定的任务

答案 2 :(得分:0)

这可能取决于列表的大小。如果将列表保存在内存中不是问题,那么我会在处理文件之前完成列表。 原因很简单:一方面,由于文件系统的组织,扫描目录树通常很快;在第二方面,您应该一次按顺序在一个文件上工作,以获得更好的性能(如果您是多任务处理并同时处理许多文件,那么您的磁盘将会变慢)。