Java 为什么';t StringReader.Read()返回一个字节?

Java 为什么';t StringReader.Read()返回一个字节?,java,char,ascii,byte,stringreader,Java,Char,Ascii,Byte,Stringreader,我在数据结构分配(哈夫曼代码)中使用StringReader,并测试是否已到达字符串的末尾。我发现StringReader.read()返回的int值不是-1,而是65535,因此将结果转换为一个字节解决了我的无限循环问题 这是JDK中的一个bug,还是将Reader.read()调用返回的值强制转换为字节的常见做法?还是我遗漏了什么 我的代码要点如下: StringReader sr = new StringReader("This is a test string"); char c; do

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

这是JDK中的一个bug,还是将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
StringReader sr=新的StringReader(“这是一个测试字符串”);
字符c;
做{
c=sr.read();
//}而(c!=-1)// 
StringReader#read
返回一个
int
值,如果已到达流的末尾,该值为
-1

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

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

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

事实上,它甚至不会编译。我得到:

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

由于调用返回一个
int
,我建议您将其存储为int

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

StringReader sr=新的StringReader(“这是一个测试字符串”);
int i;//

此代码将解决您的疑问。

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

`char c=(char)-1;System.out.println(c!=-1);`为MEI编译如果您有一个变量
char c
(与OP一样),则
c=sr.read()(OP也有)无法编译。字符串宽度问题是有道理的,我不得不改变递归方法的基本大小写,我只是测试了一下,没有转换到(字节),一切都很好>\u哦,顺便提醒一下,忘记转换为char是一个打字错误,很抱歉。
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 :-)
 char c = (char) -1;
        System.out.println(""+c);
        System.out.println(""+(byte)c);