我想快速有效地列出单个目录中包含的大量文件(10,2万左右).我已经阅读了很多帖子,特别是在这里解释了Java实现这一目标的短暂内容,主要是由于底层文件系统(可能Java 7有一些答案).这里的一些帖子提出了本机调用或管道等替代方案,我确实理解在正常情况下最好的选项是java调用 - String [] sList = file.list(); 这比file.listFiles()略胜一筹; 此外,有人建议使用多线程(也是Executor服务).
那么,问题在于我对如何编写多线程方式的实用技巧很少.所以我的逻辑肯定是不正确的.不过,我试过这种方式:
像这样的东西,来电者班 -
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上它不起作用,我的意思是除非我们在同一目录中搜索
亲切的问候
多线程对于列出多个目录很有用.但是,您不能将单个调用拆分为单个目录,我怀疑如果您可以按照任何顺序返回文件,它会更快.
学习多线程的第一件事是,并非所有解决方案都只是通过使用多个线程来更快或更简单.
| 归档时间: |
|
| 查看次数: |
2447 次 |
| 最近记录: |