Android:InputStream.read()及其“-1”返回的可靠性如何?

时间:2013-04-20 07:09:38

标签: java android

我的问题与方法 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]

我想要进行故障安全检查。我在循环中所做的也是检查socket是否变为null,如果是,则打破循环。

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

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

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

  

如果",只是说,"如果"连接已关闭,但read()不返回" -1

没有这样的条件。这是一个矛盾。

  

如果发生了什么事情,并且-1永远不会成为现实怎么办?

它不能。

  

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

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

  

如何确定?

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

NB测试套接字或输入流为空之后您尝试读取并且没有例外或EOS是徒劳的。