java - 我应该先收集文件然后执行任务还是应该边收集边执行任务?)

标签 java file io

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

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

应该注意的是,我需要对文件执行的操作包括对它们的 IO 操作,这可能会失败。 此外,我正在遍历的文件夹和文件集可能达到 400 个文件夹或 5000 个文件左右,文件大小可能达到几千兆(同样,仅遍历文件时不那么相关但相关,因为我打算执行 IO 任务)。 .

有什么想法吗?

谢谢。

最佳答案

您应该开始在文件系统上导航,创建一个 Runnable/Callable 实现来实现您想要对这些文件执行的操作,并在找到的每个文件之前将其提交到 ThreadPool(您可以从 Executors 类中创建一个)。

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

关于java - 我应该先收集文件然后执行任务还是应该边收集边执行任务?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884960/

相关文章:

java - 在android中解析json日期字符串

java - 子串(IndexOf( ))

java - java比较和排序

java - 为 Fragment 中的对象赋值时出现问题

java - 如何在多线程程序中传递或共享开放流引用?

c++ - 在 C++ 中的单独文件中拥有命名空间的正确方法是什么?

php - 使用 PHP/MySQL 安全地存储和服务用户文件

C#在运行时向项目添加嵌入式资源

go - ioutil.ReadAll替代方案,仅使用数据,而无需复制字节数组

c++ - 带有字符显示的 vector