从java套接字无限读取(windows)

从java套接字无限读取(windows),java,bufferedreader,java-io,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。你知道如

简单代码

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中有一些内存损坏。但仅在Windows2012上用Java8复制。https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.htmlread 读取的字符,作为0到65535 0x00-0xffff范围内的整数,如果已到达流的末尾,则为-1。 问题:读取永不返回-1。甚至客户端套接字也关闭了

有时它卡住了,因为读卡器返回ffff

这段代码根本不会被“卡住”,更不用说因为读取器返回0xffff了。它返回0..0xffff范围内的任何字符,所有字符都是数据,没有问题,或者在流末尾返回-1

这里的问题是,当read返回-1,即0xFFFFFF时,您将其存储到一个char中,因此其值变为0xffff,它不等于-1,因为它不等于-1,所以您将永远在流的末尾循环。不是“卡住”


ch需要声明为int。

首先阅读主题问题,不要链接随机java主题@我无法理解你在说什么。OP发布了代码,我在你的链接中没有看到任何适用于这个问题的答案。请保持它的相关性和建设性。正如你在另一篇评论中提到的,看起来客户一直在阅读EOF/EOS-1值。在linkwd帖子的一个答案中,应该是一段我没有测试自己的工作代码。因此,我假设@kain的问题在于不正确的声明或强制转换。现在我看到链接的帖子使用的字节类型是错误的,但适用于ASCII。正如@EJP所写的,强制转换为int是必须的。您好,我修复了示例中的代码。它只是一些伪代码。问题:读取永不返回-1。甚至客户端套接字也关闭了,这就是我所说的原因。对不起,我遗漏了一些东西。ch声明为int。ffff为65535。int-1应该毫无问题地阅读:不显示在您的帖子中。这个问题是由将ch声明为char引起的。那么,如果读取器返回0xffff,为什么这个代码会被“卡住”呢?