我想快速高效地列出包含在单个目录中的大量文件(10,20,000左右)。 我已经阅读了不少帖子,特别是在这里解释了Java的短暂实现,主要由于底层文件系统(可能Java 7对此有一些答案)。 这里的一些帖子提出了诸如本地调用或管道等替代方案,并且我明白在正常情况下最好的选项是java调用 - String [] sList = file.list();这只比file.listFiles()稍微好点; 此外,还有一个使用多线程(也是Executor服务)的建议。Java:从单个目录中列出所有文件(10-20,000 +)
那么,这里的问题是我很少有如何编码多线程方式的实用知识。所以我的逻辑必然是错误的。不过,我想是这样的:
- 创建的对象
- 然此列表的环数线程的列表,称为。开始(),并立即。睡眠(500)
- 在线程类,过度骑着运行methos到包括.LIST()
这样的事情,主叫类 -
String[] strList = null;
for (int i = 0; i < 5; i++){
ThreadLister tL = new ThreadLister(fit);
threadList.add(tL);
}
for (int j = 0; j < threadList.size(); j++) {
thread = threadList.get(j);
thread.start();
thread.sleep(500);
}
strList = thread.fileList;
和Thread类作为 -
public String[] fileList;
public ThreadLister(File f) {
this.f = f;
}
public void run() {
fileList = f.list();
}
我可能会离开这里与多线程,我想这一点。 我非常感谢我的多线程要求的解决方案。额外的好处是我会学习更多关于实用多线程。
查询更新
那么,显然多线程是不是要帮我(以及我现在认识到它并不是一个真正的解决方案)。感谢您帮助我排除线程。
所以我试过了,
1. FileUtils.listFiles()
来自apache commons--差别不大。
2.本地电话即, exec("cmd /c dir /B .\\Test")
- 这里执行速度很快,但是当我使用需要时间的while循环读取Stream时。
实际上我需要的是文件名,取决于单个目录中大约100k个文件中的某个过滤器。所以我使用像File.list(new FileNameFilter())
。
我相信FileNameFilter没有任何好处,因为它会尝试首先匹配所有文件,然后发出输出。
是的,据我所知,我需要一种不同的方法来存储这些文件。我可以尝试的一个选择是将这些文件存储在多个目录中,但我还没有尝试过(我不知道这是否会有所帮助) - 正如鲍里斯之前提出的。
还有什么可以是一个更好的选择,在Unix上的本地调用ls与文件名匹配有效地工作。我知道在Windows上它不工作,我的意思是,除非我们在同一个目录正在寻找
亲切的问候
我也怀疑使用多线程将会有所帮助,因为没有办法告诉“list()”方法从哪里开始列出文件,所以你最终会重新创建列表多次。 – camickr 2010-12-10 16:25:53
看来你必须退一步,重新思考将多个文件存储在一个目录中的实现。例如,看看苹果如何用他们的iPod解决了这个问题。有大约50个用于保存文件的文件夹。 – 2010-12-10 16:29:14
@camickr - 是的,当我试图运行此程序时,它确实多次显示列表长度。 – 2010-12-10 16:46:29