我正在清理我们工作中的一些代码库,其中一个较旧的类用于读取和写入数据。此数据是 US-ASCII 编码字符串和二进制编码原语的混合。
当前实现使用DataInputStream,但正如您在文档中看到的那样,readLine()
由于与将字节转换为字符相关的问题,该方法已被弃用。虽然这个编码问题并没有真正为我们弹出,但弃用是一个问题,因为它已经不适用于 OpenJDK 7 的某些版本,并且弃用意味着它可以在将来完全删除。“官方”替代方案是使用readLine
BufferedReader ,但我们无法使用 DataInputStream 进行完全交换,因为 BufferedReader 无法真正处理二进制编码的原语。
“混合”这两个类的问题在于,当 BufferedReader 从流中缓冲出来时,它会推进流标记。这意味着readDouble()
从 DataInputStream 对方法的后续调用将因 IOExceptions 或 EOFExceptions 而失败,因为流标记的实际位置不是它“应该”在应用程序逻辑的上下文中的位置。
我研究了某种 hacky mark()
/reset()
策略,但有时流由不支持mark()
/的 FileInputStream 支持reset()
。
除了更改我们的数据协议以将原语写成字符或编写我自己的实现readLine()
(这令人惊讶地不平凡)之外,有没有办法实现这一点?在这一点上,我什至愿意考虑一个外部库。