字符 reader(如 FileReader),基于字符偏移进行动态重新定位

Character reader (like FileReader) with dynamic repositioning based on characters offset

我正在寻找类似于 RandomAccessFile 的东西,它允许根据字符(而不是字节)偏移量在大文件中定位,并允许从那里读取。 FileReader 或我遇到的大多数实现没有类似 seek 的方法,例如 RandomAccessFile 中提供的方法。

这样的 reader 存在吗?

tl;dr 不存在这样的 Reader,因为它不能轻易地适用于所有编码。

如果您使用的编码是 fixed-width 编码(例如 ISO-8859-*、Windows 代码页、ASCII、UCS-2,...)那么这可以工作,因为您只需将字符偏移量乘以某个常数(取决于编码,通常为 1)即可获得字节偏移量。

事实上,您可以通过在底层 InputStream 上寻找(确保 而不是 来使用 BufferedReader,因为缓冲可能会被寻求抛弃)。

但是一些非常流行的编码(以及一些不太流行的编码)是 variable-width,这意味着每个字符可以由不同数量的字节表示。 UTF-8 和 UTF-16 是 well-known 示例,但其他 Shift-JIS 也有此 属性。

对于 variable-width 编码,在没有任何索引或先验知识的情况下创建这样的流是不可能的。一个 可以 通过只读取所需的字节数来实现 seek(),但这实际上并没有真正的 seek 的好处,因为你会实际上必须从磁盘读取“跳过的”字节才能知道要走多远。