Java:列出单个目录中的所有文件(1020000+)
我想快速高效地列出单个目录中包含的大量文件(1万、2万左右)。 我读过很多帖子,尤其是在这里,它们解释了Java实现这一目标的短处,基本上是由于底层的文件系统(Java 7可能对此有一些答案)。 这里的一些帖子提出了一些替代方案,比如本机调用或管道等,我知道在正常情况下最好的选择是java调用 -String[]sList=file。list();这只比文件稍微好一点。listFiles(); 此外,有人建议使用多线程(也是执行器服务)
这里的问题是,我对如何以多线程的方式编写代码几乎没有实用知识。所以我的逻辑肯定是错误的。尽管如此,我还是试着这样做:
- 创建了几个线程对象的列表
- 运行了这个列表的循环,称为。立即开始。睡眠(500)
- 在thread类中,过度使用run方法来包含。列表()
类似这样的呼叫类-
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;
线程类为-
public String[] fileList;
public ThreadLister(File f) {
this.f = f;
}
public void run() {
fileList = f.list();
}
我想,我可能在多线程方面做得太差了。 我非常希望能为我的需求找到一个解决方案——多线程。另外一个好处是,我将学习更多关于实用多线程的知识
Query Update
显然,多线程对我没有帮助(我现在意识到它实际上不是一个解决方案)。谢谢你帮我排除了线程
所以我试着,
1.FileUtils.listFiles()
来自apache commons——差别不大
2.本地电话exec("cmd /c dir /B .\\Test")
-在这里,这执行得很快,但当我使用while循环读取流时,这需要很长时间
实际上我需要的是文件名,这取决于单个目录中大约100k个文件中的某个过滤器。所以我用的是File.list(new FileNameFilter())
我认为FileNameFilter没有任何好处,因为它会先尝试与所有文件进行相应的匹配,然后给出输出
是的,我明白,我需要一种不同的方法来存储这些文件。我可以尝试的一个选择是将这些文件存储在多个目录中,我还没有尝试过这种方法(我不知道这是否足够有用),正如Boris早些时候所建议的
还有什么更好的选择,文件名匹配的Unix ls上的本机调用能否有效工作。我知道在windows上它不起作用,除非我们在同一个目录下搜索
亲切的问候
共 (0) 个答案