Java:列出单个目录中的所有文件(10-20,000 +)

Swi*_*tle 1 java

我想快速有效地列出单个目录中包含的大量文件(10,2万左右).我已经阅读了很多帖子,特别是在这里解释了Java实现这一目标的短暂内容,主要是由于底层文件系统(可能Java 7有一些答案).这里的一些帖子提出了本机调用或管道等替代方案,我确实理解在正常情况下最好的选项是java调用 - String [] sList = file.list(); 这比file.listFiles()略胜一筹; 此外,有人建议使用多线程(也是Executor服务).

那么,问题在于我对如何编写多线程方式的实用技巧很少.所以我的逻辑肯定是不正确的.不过,我试过这种方式:

  1. 创建了几个线程对象的列表
  2. 跑这个列表的循环,称为.start()并立即.sleep(500)
  3. 在线程类中,过度运行运行方法以包含.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;  
Run Code Online (Sandbox Code Playgroud)

和Thread类 -

public String[] fileList;  
public ThreadLister(File f) {  
   this.f = f;  
}  
public void run() {  
   fileList = f.list();  
}  
Run Code Online (Sandbox Code Playgroud)

我猜这可能与多线程有关.我非常感谢我对多线程要求的解决方案.增加的好处是我将学习更多关于实际多线程的知识.

查询更新

嗯,显然多线程不会帮助我(我现在意识到它实际上不是一个解决方案).感谢您帮我排除线程.
所以我试过,
1.FileUtils.listFiles()来自apache commons - 没什么区别.
2.本地电话即.exec("cmd /c dir /B .\\Test") - 这里执行得很快,但是当我使用while循环读取Stream时需要很长时间.

实际上我需要的是文件名,取决于单个目录中大约100k文件中的某个过滤器.所以我喜欢用File.list(new FileNameFilter()).
我相信FileNameFilter没有任何好处,因为它会首先尝试匹配所有文件然后给出输出.
是的,我理解,我需要一种不同的方法来存储这些文件.我可以尝试的一个选项是将这些文件存储在多个目录中,我还没试过这个(我不知道这是否足够了) - 正如Boris先前所说的那样.
还有什么可以是更好的选择,对于具有文件名匹配的Unix ls的本机调用是否有效.我知道在Windows上它不起作用,我的意思是除非我们在同一目录中搜索

亲切的问候

Pet*_*rey 6

多线程对于列出多个目录很有用.但是,您不能将单个调用拆分为单个目录,我怀疑如果您可以按照任何顺序返回文件,它会更快.

学习多线程的第一件事是,并非所有解决方案都只是通过使用多个线程来更快或更简单.