我在数据结构分配(霍夫曼代码)中使用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
最佳答案
实际上,它甚至不能编译。我得到:
类型不匹配:无法从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的迹象。