我正在清理工作中代码库的一些块,其中一个较旧的类用于读取和写入数据。该数据是 US-ASCII 编码字符串和二进制编码原语的混合。
当前的实现使用数据输入流 http://docs.oracle.com/javase/6/docs/api/java/io/DataInputStream.html,但正如您在文档中看到的readLine()
由于与将字节转换为字符相关的问题,该方法已被弃用。虽然这个编码问题并没有真正出现在我们身上,但弃用是一个问题,因为它已经无法在 OpenJDK 7 的某些版本上运行,并且弃用意味着它将来可能会被完全删除。 “官方”替代方案是使用readLine
from 缓冲读取器 http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html,但我们无法使用 DataInputStream 进行完全交换,因为 BufferedReader 无法真正处理二进制编码的原语。
“混合”这两个类的问题是,当 BufferedReader 缓冲流时,它会推进流标记。这意味着后续调用类似的方法readDouble()
来自 DataInputStream 的操作将失败并出现 IOExceptions 或 EOFExceptions,因为流标记的实际位置不在应用程序逻辑上下文中“应该”位于的位置。
我研究了某种黑客mark()
/reset()
策略,但有时流由 FileInputStream 支持,它不支持mark()
/reset()
.
除了更改我们的数据协议以将原语写为字符或编写我自己的实现之外readLine()
(这令人惊讶地不平凡),有什么办法可以实现这一点吗?此时我什至愿意考虑外部库。
如果当前的代码库运行良好并且您唯一的问题是deprecation
标签,我个人建议从readLine
的方法DataInputStream
类并将其移动到助手/实用程序类。这readLine
的方法DataInputStream
不使用很多实例变量,因此只需做一些工作,您应该能够很好地使用它。示例调用如下所示:Utils.readLine(dataInStream)
。这将确保即使该方法被删除,您的代码库也不会受到影响。
是的,它很老套,是的,它看起来有点难看,但它是最快且可能是最安全的替代方案(对剩余代码库的更改最少)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)