1

我的问题与InputStream.read()方法有关- 套接字编程。

我发现的每个来源都指出,当服务器或客户端关闭连接时,会返回“-1”。

但是,“如果”,只是说,“如果”连接关闭read()不返回“-1”?我们依赖别人的代码。我担心的原因是因为为了读取远程端的输入,必须创建一个无限循环,而我一直被认为远离无限循环。然而,对于 Java,我似乎别无选择!这是一个示例:

int b = 0;
    while (true)
    {
      b = inputStream.read()
      if (b == -1) break; // connection closed
    }

或者

 while (b > -1)
 b = inputStream.read()

如果发生了什么事,而 -1 永远不会变成真的怎么办?最终会陷入无限循环,增加某人设备的温度并浪费 CPU 周期!怎么可能确定?

参考文献:[http://developer.android.com/reference/java/io/InputStream.html#read%28%29][1] 和 [http://docs.oracle.com/javase/6/docs/ api/java/io/InputStream.html#read%28byte[],%20int,%20int%29][2]

我想进行故障安全检查。我在循环中所做的也是检查套接字是否变为空,如果是,则中断循环。

 while (b > -1)
    {
      b = inputStream.read()

      if (socket == null) break;
      if (outputStream == null) break;
    }

如果“-1”永远不会变为真,我还能做些什么来确保循环存在?

4

2 回答 2

2

最终会陷入无限循环,增加某人设备的温度并浪费 CPU 周期!

这不是真的,我认为你问这个问题的主要原因。read()如果没有要读取的内容,则不会忙于等待(即不断地请求 CPU)。因此,在实践中,如果不返回 -1 就不会有大问题。

read()IOException如果阅读出现问题(例如,如果InputStream关闭) ,也会抛出一个。确保在 try-block 中有循环并检查 -1 足以确保它退出循环,如下所示:

try {
    int b;
    while ((b=inputStream.read() > -1)
    {
       //Do something
    }
} catch (IOException e) {
    e.printStackTrace();
}
于 2013-04-20T08:19:48.727 回答
0

what if”,只是说,“what if” 连接关闭但 read() 不返回“-1

没有这样的条件。这在术语上是矛盾的。

如果发生了什么事,而 -1 永远不会变成真的怎么办?

它不能。

最终会陷入无限循环,增加某人设备的温度并浪费 CPU 周期!

不真实。如果这种不可能的情况发生,read() 将无限期地阻塞而不消耗任何 CPU。

怎么可能确定?

你可以相信规范,而不是问自相矛盾的问题。

NB 在您尝试读取并且没有异常或 EOS无效之后测试套接字或输入流是否为空。

于 2013-04-20T09:57:58.450 回答