数据流

探讨DataInputStream和DataOutputStream处理基本数据类型和字符串的方法,重点分析DataInputStream的readLine()方法在处理非ASCII字符及行结束符时的局限性,揭示其潜在的悬挂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataInputStream和DataOutputStream类提供了一些方法,可以用二进制格式读/写java的基本数据类型和字符串。

 

DateInputStream的readLine()方法在大多数情况下不能正确地将非ASCII字符转化为字节。这个任务现在由BufferedReader类的readLine()方法来处理。

但是这两个方法都有一个隐含的BUG,它们并不能总把一个回车识别为行结束。

实际上,readLine()只能识别换行或回车/换行对。在流中检测到回车时,readLine()在继续之前会等待,查看下一个字符是否为换行。如果是换行,就抛掉这个回车和换行,把这一行作为String返回。如果不是换行,就抛掉这个回车,把这一行作为String返回,刚读取的这个额外的字符会成为下一行的一部分。

不过,如果回车是流的最后一个字符,那么readLine()会挂起,等待最后一个字符的出现,但这个字符永远不会出现。

这个问题在读取文件时表现不太明显,因为几乎可以肯定会有下一个字符:如果没有别的字符,那么会由-1表示流结束。