2011-03-02 23 views
9

有谁知道任何提供从磁盘处理大量文件(写入/读取)的功能的Java库(开放源代码)。我正在谈论2-4百万个文件(其中大多数是pdf和ms文档)。将所有文件存储在单个目录中并不是一个好主意。我不希望重新发明轮子,而是希望已经有很多人完成了。大量文件的Java内容API

特点我找 1)能写/读从磁盘 2能够创建随机目录/子目录新文件 2)提供版本/审计(可选)

我的文件)正在研究JCR API,它看起来很有前途,但它始于一个工作区,并且不确定在有多个节点时性能如何。

回答

0

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

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

版本控制或审计将必须提供您自己的自定义解决方案。有很多方法可以处理这个问题,并且您可能需要填写特定需求。特别是如果您担心开源API的性能,那么只需简单编写一个专门适合您需求的解决方案,就可以获得最佳结果。

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

看来只需设计一个特定于您的需求的解决方案就容易多了。

1

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

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

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

根据不同的文件,你也可以考虑存储在数据库文件本身的大小 - 如果你这样做,这将是微不足道的补充版本,你不一定要创建随机文件名,因为您可以使用自动生成的主键来引用它们。