如何在 Java 中快速检索目录列表?

2024-02-15

假设有一个非常简单的程序,列出给定目录的所有子目录。听起来很简单吗?除了在 Java 中列出所有子目录的唯一方法是使用文件名过滤器 http://java.sun.com/javase/6/docs/api/java/io/FilenameFilter.html结合文件.list() http://java.sun.com/javase/6/docs/api/java/io/File.html#list(java.io.FilenameFilter).

这适用于简单的情况,但当文件夹有 150,000 个文件和 2 个子文件夹时,等待 45 秒迭代所有文件并测试 file.isDirectory() 是愚蠢的。有没有更好的方法来列出子目录?


附言。抱歉,请保存有关同一目录中文件过多的讲座。我们的生活环境将此作为要求的一部分。


正如已经提到的,这基本上是一个硬件问题。磁盘访问总是很慢,并且大多数文件系统并不是真正设计来处理包含如此多文件的目录的。

如果您出于某种原因必须将所有文件存储在同一目录中,我认为您必须维护自己的缓存。这可以使用本地数据库(例如 sqlite、HeidiSQL 或 HSQL)来完成。如果您想要极致的性能,请使用 java TreeSet 并将其缓存在内存中。这至少意味着您将不必经常读取该目录,并且它可以在后台完成。您可以使用系统本机文件更新通知 API(Linux 上的 inotify)订阅目录更改,从而进一步减少刷新列表的需要。

这对你来说似乎不可能,但我曾经通过将文件“散列”到子目录中解决了类似的问题。就我而言,挑战是存储数百万张带有数字 ID 的图像。我构建的目录结构如下:

images/[id - (id % 1000000)]/[id - (id % 1000)]/[id].jpg

这对我们来说效果很好,也是我推荐的解决方案。您可以通过简单地获取文件名的前两个字母,然后再获取接下来的两个字母来执行类似于字母数字文件名的操作。我也这样做过一次,它也完成了工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java 中快速检索目录列表? 的相关文章

随机推荐