简单代码
InputStream is = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("utf-8")));
while (true) {
int ch = reader.read();
if(ch==-1){
break;
}
}
有时它会卡住,因为读者会返回ffff。任何想法如何找到理由?看起来像jvm中的一些内存损坏。但仅在Windows 2012上的java 8中重现。https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#read() The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached.
问题:读取永远不会返回-1。甚至客户端套接字已关闭
答案 0 :(得分:0)
有时它会卡住,因为读者会返回ffff
此代码根本没有“卡住”,更不用说读者返回0xffff了。它返回0..0xffff范围内的所有char,所有char都是数据,不是问题,或者在流结束时为-1。
这里的问题是,当read()
返回-1,即0xffffffff时,您将其存储到char
中,因此其值变为 0xffff,而不是比较等于-1,因为它不是,所以你循环永远在流的末尾。不要'卡住'。
ch
需要声明为int
。