繁体   English   中英

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

[英]Android: How Reliable is InputStream.read() and its “-1” return?

我的问题与方法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#读取%28byte [],%20int,%20int%29] [2]

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

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

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

我还能做些什么以确保在“ -1”永远不会成真的情况下存在循环?

一个人将陷入无限循环,从而增加某人设备的温度并浪费CPU周期!

这是不对的,我认为您提出这个问题的主要原因。 read() 忙等待(即要求不断的CPU),如果它没有什么阅读。 因此,在实践中,如果不返回-1不会有什么大问题。

read()出现问题(例如,如果InputStream关闭),则read()还会引发IOException 确保在try块中具有循环以及检查-1足以确保它脱离循环,例如:

try {
    int b;
    while ((b=inputStream.read() > -1)
    {
       //Do something
    }
} catch (IOException e) {
    e.printStackTrace();
}

如果“,则说”如果...“,连接已关闭,但read()不会返回” -1“

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

如果发生了什么,并且-1从未变为真该怎么办?

不可以

一个人将陷入无限循环,从而增加某人设备的温度并浪费CPU周期!

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

怎么能确定?

您可以相信规范,而不会提出自相矛盾的问题。

注意:尝试读取且没有异常或EOS ,对套接字或输入流是否为null 进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM