为什么DataInputStream无法正确读取char?

时间:2019-10-21 14:14:39

标签: kotlin eofexception

从DataInputStream单个字符读取数据时,我试图在DataInputStream中写入String,但是出现错误。

我希望readChar()返回'q',但是方法:

assertEquals('q', DataInputStream("q".byteInputStream(Charsets.UTF_8)).readChar())

引发异常:

  

java.io.EOFException   在java.io.DataInputStream.readChar(DataInputStream.java:365)

1 个答案:

答案 0 :(得分:1)

请查看DataInput.readChar(),其中指出:

  

读取两个输入字节并返回一个char值。令a为读取的第一个字节,b为第二个字节。返回的值为:

(char)((a << 8) | (b & 0xff))
     

此方法适合于读取由接口writeCharDataOutput方法写入的字节。

最后一句话基本上也是解决方案。如果您使用writeChar写入数据,则读取将按预期进行,即以下内容将为您提供成功的测试用例:

assertEquals('q', DataInputStream(ByteArrayOutputStream().apply {
                    DataOutputStream(this).use {
                      it.writeChars("q")
                    }
                  }.toByteArray().inputStream())
                  .readChar())

以下内容,即使在界面中未提及,也可以解决:

assertEquals('q', DataInputStream("q".byteInputStream(Charsets.UTF_16BE)).readChar())