2013-02-21 114 views
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从我这里标明的内容,以在哪里我跳过了,将被保存在内存中?

从文档,

限制上而仍然保持 标记读取的字符数。尝试在读取 字符之后重置流,直至达到此限制或超出此限制可能会失败。比输入缓冲区大小更大的限制值 将导致分配的新缓冲区为 ,其大小不小于限制。因此应谨慎使用较大的值 。

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

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

+0

听起来你想使用RandomAccessFile。 – 2013-02-21 02:04:30

回答

6

您可能正在寻找RandomAccessFile类。

+0

刚刚发现它,这正是我之后,谢谢 – 2013-02-21 01:54:14

1

另一种选择

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

SeekableByteChannel - 甲SeekableByteChannel延伸了ByteChannel和 允许维护和修改到它所连接的底层 实体的当前位置。如果允许的话,它有方法获取底层实体的大小或将其截断为给定的大小。

0

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

相关问题