0

我和我的团队被要求使用 Java 库支持的文件格式,该格式包含有关某些较大文件的各种元数据。事实上,当权者希望我们将大文件(可能 100MB)和其他相关文件(元数据、非破坏性编辑等)打包到一个捆绑的存档文件中。

对于一次性创作来说,这是一件轻而易举的事:只需将所有内容都放入一个 Zip 文件中。但我们希望能够不断更新元数据、非破坏性编辑等。我们不希望将整个 >100MB 的内容转储到一个临时目录,然后将所有内容压缩回来,只是为了在其中一个目录中添加一行元数据文件。

有一些项目(例如TrueVFS)通过声称将 zip 文件或其他存档文件格式抽象为文件系统,表面上听起来很理想。但仔细观察,我们获得的唯一就地更新功能似乎是简单地附加新文件,而不是实际更改或附加到单个文件。

我们需要一些介于 Zip 文件和关系数据库之间的文件格式。具有层次结构的东西会很棒。它必须有效地支持相当大的文件(超过 100MB),并允许随机访问以添加、删除和更改存档中的单个文件。我很惊讶找不到任何东西。有什么建议么?

PS 几年前我有过糟糕的经历,微软的复合文件格式被破坏了。我不知道像Apache POIFS这样的东西对于大文件是否可靠且高效。

4

2 回答 2

1

我不相信您所要求的内容很容易实现,原因很简单:文件系统通常不支持在文件中间插入数据 - 除非截断和重写其余部分。这意味着当该文件存储在档案中时,对普通文件的简单追加会变成截断重写操作。

为了允许这样的操作,您必须找到一些基本上可以复制实际文件系统的大部分功能的基于块的格式。

我会考虑重构整个系统以在该大数据文件上强制执行某些结构。这将允许您将其变成可以存储在数据库中的东西。例如,基于行的文本可以存储在具有两列的表中 - 行号作为主键和行文本。任何基于行的操作很容易变成基于数据库的操作。

然后,您可以只使用SQLite等嵌入式数据库将所有内容保存在同一个文件中,而无需依赖外部服务器。

于 2012-12-07T21:45:22.207 回答
0

根据您希望在什么平台上运行您的应用程序,您可以使用我们的实体文件系统- 这是一个由可自动调整大小的容器文件支持的虚拟文件系统。它是用 Ansi C 编写的,并具有适用于 Android 的 Java JNI 包装器(并且可以根据要求将该包装器带到其他平台——我们之前只是没有这样的目标)。

还有代码库文件系统,据我了解,它还为 Java 提供了 JNI。

于 2012-12-08T06:57:11.757 回答