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

Java 如何保持文件打开以供阅读,java,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

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

这可能吗

我想打开一个文件的句柄,其他任何东西都不会读/写这个文件,并且能够在以后的某个时间点从任何给定的偏移量和长度抓取数据,而无需再次在磁盘上搜索该文件

我以为会有某种

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
,我标记的内容,我跳过的内容,会保存在内存中吗

从文件来看

限制静止时可读取的字符数 保留标记。尝试在读取后重置流 达到或超过此限制的字符可能会失败。一个更大的极限值 超过输入缓冲区的大小将导致创建新的缓冲区 已分配,其大小不小于限制。因此,价值很大 应小心使用

它说的是“读取”,所以如果我跳过,它可能不计入这个限制(这是有意义的),但我可能读取了相当多的内容,所以看起来这个新分配的输入缓冲区可能会变得相当大。我不想发生那种事


有更好的方法吗?

您可能正在寻找该课程。

另一种选择

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

SeekableByteChannel-一个SeekableByteChannel通过Techannel和 允许维护和修改基础上的当前位置 它所连接的实体。它有一些方法来获取 基础实体或将其截断为给定大小(如果允许)


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

听起来您想使用RandomAccessFile。