我在数据结构分配(霍夫曼代码)中使用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
答案 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 String
是chars
的序列,它不是字节,而是表示UTF-16代码点的值。 read
的语义是从输入流返回下一个 atom 。在StringReader
的情况下,原子组件是一个16位值,不能表示为单个字节。