Java 为什么';t StringReader.Read()返回一个字节?
我在数据结构分配(哈夫曼代码)中使用StringReader,并测试是否已到达字符串的末尾。我发现StringReader.read()返回的int值不是-1,而是65535,因此将结果转换为一个字节解决了我的无限循环问题 这是JDK中的一个bug,还是将Reader.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 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);