用于大量文件的Java内容API

时间:2011-03-02 15:12:34

标签: java

有没有人知道任何提供从磁盘处理大量文件(写/读)的功能的java库(开源)。我说的是2-4百万个文件(大多数是pdf和ms文档)。将所有文件存储在单个目录中并不是一个好主意。我没有重新发明轮子,而是希望已经有很多人做过这件事。

我正在寻找的功能 1)能够从磁盘写入/读取文件 2)能够为新文件创建随机目录/子目录 2)提供版本/审核(可选)

我正在研究JCR API,它看起来很有前景,但它从一个工作区开始,并且不确定当有很多节点时性能会是什么。

2 个答案:

答案 0 :(得分:1)

编辑:JCP看起来确实不错。我建议您尝试一下,看看它实际上是如何为您的用例执行的。

如果您在Windows上运行系统并且发现在某些时候遇到了可怕的n ^ 2性能,那么您可能会遇到自动生成8.3文件名所造成的性能损失。当然,你可以disable 8.3 filename generation,但正如你所指出的那样,将大量文件存储在一个目录中仍然不是一个好主意。

我看到处理大量文件的一个常见策略是为文件名的前n个字母创建目录。例如,document.pdf将存储在d / o / c / u / m / document.pdf中。我不记得曾经在Java中看到过这样做的库,但它看起来非常简单。如有必要,您可以创建一个数据库来存储查找表(将键映射到统一分布的随机文件名),这样您就不必每次启动时都重建索引。如果您希望获得自动重复数据删除的好处,您可以散列每个文件的内容并使用该校验和作为文件名(但您还需要添加一个检查,这样您就不会意外丢弃其校验和与现有文件匹配的文件虽然内容实际上是不同的。)

根据文件的大小,您可能还会考虑将文件本身存储在数据库中 - 如果您这样做,添加版本控制将是微不足道的,并且您不一定要创建随机文件名,因为您可以使用自动生成的主键引用它们。

答案 1 :(得分:0)

java.io包中的功能与您自己的自定义解决方案相结合。

java.io包可以从磁盘写入和读取文件,并为新文件创建任意目录或子目录。无需外部API。

版本控制或审核必须与您自己的自定义解决方案一起提供。有很多方法可以解决这个问题,您可能需要填写特定的需求。特别是如果您关注开源API的性能,那么只需编写一个特别适合您需求的解决方案,您就可以获得最佳结果。

听起来你的模块应该在启动时扫描所有文件,并形成一个可用的所有文件的索引。根据用于共享和索引这些文件的方法,它可以经常重新扫描文件,或者您可以对其进行编码,以便在新文件或版本可用时从某个中央服务器接收消息。当有人请求文件或提供新文件时,您的模块将确切知道它的组织方式以及确切地将文件放在目录树中的位置。

似乎只需设计一个特定于您需求的解决方案就容易得多。