从java socket(windows)无限读取

时间:2017-05-10 10:26:54

标签: java bufferedreader java-io

简单代码

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。甚至客户端套接字已关闭

1 个答案:

答案 0 :(得分:0)

  有时它会卡住,因为读者会返回ffff

此代码根本没有“卡住”,更不用说读者返回0xffff了。它返回0..0xffff范围内的所有char,所有char都是数据,不是问题,或者在流结束时为-1。

这里的问题是,当read()返回-1,即0xffffffff时,您将其存储到char中,因此其值变为 0xffff,而不是比较等于-1,因为它不是,所以你循环永远在流的末尾。不要'卡住'。

ch需要声明为int