2

我希望能够在以后的任何时间打开一个(非常大的)文件并从任意点读取数据,而无需将整个内容保存在内存中。

这可能吗?

我想打开一个文件的句柄,没有其他东西可以读取/写入这个文件,并且能够在稍后从任何给定的偏移量和长度中获取数据,而无需再次在磁盘中搜索文件。

我以为会有某种

1, open handle to file
2, create reader
3, skip reader to X
4, read for Y
5, reset reader to 0
6, return to step 3

起初它似乎BufferedReader.mark是我所追求的,但文档建议如果我mark, skip, read, reset从我标记的地方到我跳过的地方的内容,会被保存在内存中吗?

从文档中,

在保留标记的同时限制可以读取的字符数。在读取达到此限制或超过此限制的字符后尝试重置流可能会失败。大于输入缓冲区大小的限制值将导致分配一个大小不小于限制的新缓冲区。因此,应谨慎使用较大的值。

它说“读”,所以也许如果我跳过,它不计入这个限制(这是有道理的),但我可能读了很多,所以看起来这个新分配的输入缓冲区可能会变得非常大。我不希望这样的事情发生...

有没有更好的方法来解决这个问题?

4

3 回答 3

6

您可能正在寻找RandomAccessFile课程。

于 2013-02-21T01:53:03.250 回答
1

另外一个选项

如果您使用的是 Java 7,它包括一个新的 ByteChannel SeekableByteChannel,. 此 Channel 保持当前位置,因此您可以从该位置读取和写入。这允许随机访问位置。

SeekableByteChannel - SeekableByteChannel扩展了 ByteChannel 并允许维护和修改它所连接的底层实体上的当前位置。如果允许,它具有获取基础实体大小或将其截断为给定大小的方法。

于 2013-02-21T02:53:28.957 回答
0

RandomAccessFile.seek(long position) 和 FileChannel.position(long position) 可以设置它们读取/写入数据的文件位置。

于 2013-02-21T05:37:07.717 回答