0

我在数据结构分配(霍夫曼代码)中使用 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
4

5 回答 5

4

事实上,这甚至没有编译。我得到:

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

由于sr.read()调用返回 anint我建议您将其存储为这样。

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

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 位字节。有人可能会争辩说 achar就足够了,但是没有空间来提供达到 EOF 的指示。

于 2010-11-15T09:17:35.577 回答
1

StringReader#read返回一个int值,-1如果已到达流的末尾。

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

System.out.println("Is it still (-1)?: " + (int) ((char) -1));
于 2010-11-15T09:15:46.060 回答
1

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

于 2010-11-15T09:16:35.153 回答
1
 char c = (char) -1;
        System.out.println(""+c);
        System.out.println(""+(byte)c);

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

于 2010-11-15T09:18:06.280 回答
1

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

于 2010-11-15T09:18:32.293 回答