为什么StringReader.Read()没有返回一个字节?

时间:2010-11-15 09:10:13

标签: java char ascii byte stringreader

我在数据结构分配(霍夫曼代码)中使用StringReader,并且正在测试是否已到达字符串的末尾。我发现StringReader.read()返回的int值不是-1,而是65535,所以将结果转换为一个字节解决了我遇到的无限循环问题。

这是JDK中的错误,还是通常的做法是将从Reader.read()调用返回的值转换为字节?或者我错过了什么?

我的代码的主旨是这样的:

StringReader sr = new StringReader("This is a test string");
char c;
do {
    c = sr.read();
//} while (c != -1);     //<--Broken
} while ((byte)c != -1); //<--Works

5 个答案:

答案 0 :(得分:4)

实际上甚至没有编译。我明白了:

  

类型不匹配:无法从int转换为char

由于sr.read()调用返回int,我建议您将其存储为此类。

这编译(并按预期工作):

StringReader sr = new StringReader("This is a test string");
int i;               // <-- changed from char
do {
    i = sr.read();

    // ... and if you need a char...
    char c = (char) i;

} while (i != -1);   // <-- works :-)

  

为什么StringReader.Read()不返回一个字节?

字符串由16位unicode字符组成。这些不适合8位字节。有人可能会说char已经足够了,但是没有空间提供EOF到达的指示。

答案 1 :(得分:1)

StringReader#read会返回int值,如果已到达流的末尾,则为-1

您的代码中的问题是您已将int值转换为char并测试char:

System.out.println("Is it still (-1)?: " + (int) ((char) -1));

答案 2 :(得分:1)

java中的字符是2个字节,因为它们以UTF-16编码。这就是read()返回int的原因,因为byte不够大。

答案 3 :(得分:1)

 char c = (char) -1;
        System.out.println(""+c);
        System.out.println(""+(byte)c);

此代码将解决您的疑问..

答案 4 :(得分:1)

Java Stringchars的序列,它不是字节,而是表示UTF-16代码点的值。 read的语义是从输入流返回下一个 atom 。在StringReader的情况下,原子组件是一个16位值,不能表示为单个字节。