6

我正在清理我们工作中的一些代码库,其中一个较旧的类用于读取和写入数据。此数据是 US-ASCII 编码字符串和二进制编码原语的混合。

当前实现使用DataInputStream,但正如您在文档中看到的那样,readLine()由于与将字节转换为字符相关的问题,该方法已被弃用。虽然这个编码问题并没有真正为我们弹出,但弃用是一个问题,因为它已经不适用于 OpenJDK 7 的某些版本,并且弃用意味着它可以在将来完全删除。“官方”替代方案是使用readLineBufferedReader 但我们无法使用 DataInputStream 进行完全交换,因为 BufferedReader 无法真正处理二进制编码的原语。

“混合”这两个类的问题在于,当 BufferedReader 从流中缓冲出来时,它会推进流标记。这意味着readDouble()从 DataInputStream 对方法的后续调用将因 IOExceptions 或 EOFExceptions 而失败,因为流标记的实际位置不是它“应该”在应用程序逻辑的上下文中的位置。

我研究了某种 hacky mark()/reset()策略,但有时流由不支持mark()/的 FileInputStream 支持reset()

除了更改我们的数据协议以将原语写成字符或编写我自己的实现readLine()(这令人惊讶地不平凡)之外,有没有办法实现这一点?在这一点上,我什至愿意考虑一个外部库。

4

3 回答 3

4

如果当前代码库运行良好并且您唯一的问题是deprecation标签,我个人建议从类的readLine方法中复制代码DataInputStream并将其移动到帮助程序/实用程序类。的readLine方法DataInputStream不使用很多实例变量,所以通过一些工作你应该能够很好地使用它。示例调用将如下所示:Utils.readLine(dataInStream). 这将确保即使删除该方法,您的代码库也不会受到影响。

是的,它很hacky,是的,它看起来有点难看,但它是最快且可能是最安全的替代方案(对剩余代码库的更改最少)。

于 2012-07-04T15:44:25.987 回答
1

我认为您应该创建一个自定义子类,DataInputStream该子类添加一个readLine类似于您需要的方法的方法。(您甚至可以覆盖现有readLine()方法。)

是的,一个高效的实现并不简单,但如果你将自定义类堆叠在BufferedInputStream.

于 2012-07-04T15:33:31.663 回答
0

我遇到了类似的问题,我设法通过使用BufferedReader缓冲区大小为 1 的 a 来解决它。

结果,方法 BufferedReader.readLine() 是 unbuffered 。

            InputStreamReader inr=(new InputStreamReader( mInputStream(),"ASCII"));
            BufferedReader  mReader=new BufferedReader(inr,1);
于 2014-08-22T11:53:13.277 回答