【发布时间】:2012-07-04 15:14:33
【问题描述】:
我正在清理我们工作中的一些代码库,其中一个较旧的类用于读取和写入数据。此数据是 US-ASCII 编码字符串和二进制编码原语的混合体。
当前实现使用DataInputStream,但正如您在文档中看到的那样,readLine() 方法已被弃用,因为与将字节转换为字符相关的问题。虽然这个编码问题并没有真正为我们弹出,但弃用是一个问题,因为它已经不适用于某些版本的 OpenJDK 7,并且弃用意味着它可以在将来完全删除。 “官方”替代方案是使用 BufferedReader 中的 readLine,但我们无法使用 DataInputStream 进行完全交换,因为 BufferedReader 无法真正处理二进制编码的原语。
“混合”这两个类的问题在于,当 BufferedReader 从流中缓冲时,它会推进流标记。这意味着从 DataInputStream 对 readDouble() 等方法的后续调用将因 IOExceptions 或 EOFExceptions 而失败,因为流标记的实际位置不是它“应该”在应用程序逻辑上下文中的位置。
我研究了某种 hacky mark()/reset() 策略,但有时流由不支持 mark()/reset() 的 FileInputStream 支持。
除了更改我们的数据协议以将原语写为字符或编写我自己的readLine() 实现(这令人惊讶地不平凡)之外,有没有办法实现这一点?在这一点上,我什至愿意考虑使用外部库。
【问题讨论】:
-
您听说过 Apache Commons IO 吗? commons.apache.org/io 我几乎已经放弃了内置的 Java SDK IO 类;它们使用起来很复杂,而且通常不能按预期工作。
-
您可以将底层输入流包装到缓冲流中。然后将
BufferedReader或DataInputStream放在上面。此设置保证您可以使用mark()/reset() -
当您说您可以更改数据协议时,这是否意味着您不会被旧方法编码的大量文件所困?
-
@JesseWebb 考虑到我的具体情况,看起来 Apache 库可能会受到相同的限制,但我没有足够的时间来查看它。感谢您的建议!
-
@biziclop 我会调查的。可能会奏效。
标签: java io bufferedreader readline datainputstream