1

我有一个将 RandomAccessFile 写入文件系统的 java 应用程序。它必须是 RAF,因为有些事情直到最后才知道,然后我会在文件开头回溯并写入一些信息。

我想以某种方式将文件放入 zip 存档中。我想我可以在最后这样做,但这将涉及复制到目前为止已写入的所有数据。由于这些文件可能会变得非常大,因此我更喜欢一种不涉及复制数据的方式。

有没有办法获得类似“ZipRandomAccessFile”的东西,比如 jdk 中可用的 ZipOutputStream?

它不必只是 jdk,我不介意使用第三方库来完成工作。

任何想法或建议..?

4

3 回答 3

1

也许您需要更改文件格式以便可以按顺序写入。

事实上,由于它是一个 Zip 并且 Zip 可以包含多个条目,因此您可以将顺序数据写入一个ZipEntry,而将“仅在完成时”已知的数据写入一个单独的ZipEntry- 这提供了两全其美的效果。

它很容易编写,不必回到大顺序块的开头。它很容易阅读——如果消费者在阅读更大的资源之前需要知道“标题”数据,他们可以在继续之前阅读该 zip 条目中的数据。

于 2012-09-06T13:13:52.457 回答
0

指定 DEFLATE 格式的方式,只有从头开始阅读才有意义。因此,每次您来回寻找时,底层的 zip 实现都必须从头开始读取文件。如果您修改某些内容,则必须首先解压缩整个文件(不仅仅是到修改点),将更改应用于解压缩的数据,然后再次压缩整个文件。

总而言之,ZIP/DEFLATE 不是这种格式。但是,将您的数据分解成更小的、固定大小的文件并单独压缩可能是可行的。

于 2012-09-06T12:48:39.377 回答
0

压缩的重点是识别数据中的冗余(例如一些更频繁出现的字符或重复模式),并通过在没有冗余的情况下对其进行编码来使数据更小。这使得创建允许随机访问写入的压缩算法变得不可行。尤其:

  • 您永远不会事先知道一条数据可以被压缩到什么程度。因此,如果您更改某些数据块,其压缩版本很可能会更长或更短。
  • 作为一种压缩算法处理数据流,它使用迄今为止积累的知识(如发现的重复模式)在其当前位置压缩数据。因此,如果您更改某些内容,则算法需要重新压缩从更改到结束的所有内容。

所以唯一合理的解决方案是操作数据并在最后一次压缩它。

于 2012-09-06T13:36:04.887 回答