如何保持文件打开以供阅读

时间:2013-02-21 01:50:36

标签: java

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

这可能吗?

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

我原以为会有某种

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我标记的内容到我跳过的内容将保留在内存中?

来自文档,

  

限制静止时可以读取的字符数   保留商标。尝试在读取后重置流   达到此限制或超出此限制的字符可能会失败。限制值更大   比输入缓冲区的大小会导致新的缓冲区   分配的大小不小于限制。因此价值很大   应小心使用。

它说“读”,所以也许如果我跳过,它不计入这个限制(这是有意义的),但我可能正在阅读相当多,所以看起来这个新分配的输入缓冲区可能会变得相当大。我不希望这发生......

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

3 个答案:

答案 0 :(得分:6)

您可能正在寻找RandomAccessFile课程。

答案 1 :(得分:1)

另一个选择

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

  

SeekableByteChannel - SeekableByteChannel 扩展了ByteChannel和   允许维护和修改底层证券的当前头寸   它所连接的实体。它有方法来获得大小   基础实体或将其截断为给定大小(如果允许)。

答案 2 :(得分:0)

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