有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:列出单个目录中的所有文件(1020000+)

我想快速高效地列出单个目录中包含的大量文件(1万、2万左右)。 我读过很多帖子,尤其是在这里,它们解释了Java实现这一目标的短处,基本上是由于底层的文件系统(Java 7可能对此有一些答案)。 这里的一些帖子提出了一些替代方案,比如本机调用或管道等,我知道在正常情况下最好的选择是java调用 -String[]sList=file。list();这只比文件稍微好一点。listFiles(); 此外,有人建议使用多线程(也是执行器服务)

这里的问题是,我对如何以多线程的方式编写代码几乎没有实用知识。所以我的逻辑肯定是错误的。尽管如此,我还是试着这样做:

  1. 创建了几个线程对象的列表
  2. 运行了这个列表的循环,称为。立即开始。睡眠(500)
  3. 在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) 个答案