1

我正在用Java创建一个压缩算法;要使用我的算法,我需要大量有关目标文件结构的信息。

收集数据后,我需要重新读取文件。 <-但我不想。

在重新读取文件时,我通过将文件的数据“转换”为一种相当特殊的格式,使其成为一个很好的压缩目标。然后我压缩它。

现在的问题是:

  1. 我不想打开一个新的 FileInputStream 来重新读取文件。
  2. 我不想将转换后的文件(通常是目标文件大小的 150%)保存到磁盘。

有什么方法可以“重置” FileInputStream 以移动到文件的开头,以及如何在不写入磁盘的情况下有效地存储大量“转换”的数据?

4

3 回答 3

4

您可以使用一个或多个 RandomAccessFiles。您可以将它们内存映射到不消耗堆(实际上它们使用大约 128 个字节)或直接内存但可以随机访问的 ByteBuffer()。

您的临时数据可以存储在直接 ByteBuffer(s) 或更多内存映射文件中。由于您可以随机访问原始数据,因此您可能不需要像您想的那样在内存中复制尽可能多的数据。

这样,您只需几 KB 的堆就可以访问整个数据。

于 2011-11-02T17:36:21.480 回答
0

reset方法,但你需要FileInputStreamBufferedInputStream.

于 2011-11-02T17:36:30.663 回答
0

您可以使用 RandomAccessFile,或者 java.nio ByteBuffer 是您正在寻找的。(我不知道。)

管道/流可能会节省资源:立即写入压缩流。

回答您关于重置的问题:不可能;基类 InputStream 提供了标记和重置标记,但 FileInputStream 已针对多个操作系统进行了优化,并且只进行顺序输入。关闭和打开是最好的。

于 2011-11-02T17:43:44.733 回答