我希望能够在以后的任何时间打开(非常大)的文件并从任意点读取数据,而不会将整个内容保留在内存中。
这可能吗?
我想打开一个文件的句柄,没有其他任何东西可以读/写这个文件,并且能够从任何给定的偏移量和数据中获取数据。稍后的长度,而不是再次在磁盘上搜索文件。
我原以为会有某种
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 :(得分:6)
您可能正在寻找RandomAccessFile
课程。
答案 1 :(得分:1)
另一个选择
如果您使用的是Java 7,则它包含一个新的ByteChannel SeekableByteChannel
。此通道保持当前位置,因此您可以从此位置读取和写入。这允许随机访问位置。
SeekableByteChannel - SeekableByteChannel 扩展了ByteChannel和 允许维护和修改底层证券的当前头寸 它所连接的实体。它有方法来获得大小 基础实体或将其截断为给定大小(如果允许)。
答案 2 :(得分:0)
RandomAccessFile.seek(long position)和FileChannel.position(long position)可以设置读取/写入数据的文件位置。