Java Android:InputStream.read()及其-1“;返回?

Java Android:InputStream.read()及其-1“;返回?,java,android,Java,Android,我的问题与一个方法InputStream.read()-socket编程有关 我找到的每个源都声明,当服务器或客户端关闭连接时,将返回“-1” 但是,“如果”只是说,“如果”连接已关闭,但是read()没有返回“-1”呢?我们依赖别人的代码。我担心的原因是,为了读取远端的输入,必须创建一个无限循环,我一直被认为远离无限循环。然而,对于Java,我似乎没有选择的余地!以下是一个示例: int b = 0; while (true) { b = inputStream.r

我的问题与一个方法InputStream.read()-socket编程有关

我找到的每个源都声明,当服务器或客户端关闭连接时,将返回“-1”

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

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

如果发生了什么事情,并且-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]

我想做一次自动防故障检查。我在循环中所做的就是检查套接字是否变为null,如果是,则中断循环

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

      if (socket == null) break;
      if (outputStream == null) break;
    }
在“-1”永远不会变为真的情况下,我还能做些什么来确保循环存在

一个将在一个无限循环中结束,增加 有人的设备和浪费CPU周期

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

read()。确保在try块中有循环,同时检查-1足以确保它退出循环,因此:

try {
    int b;
    while ((b=inputStream.read() > -1)
    {
       //Do something
    }
} catch (IOException e) {
    e.printStackTrace();
}
what if“,只是说,“what if”连接已关闭,但read()不返回“-1

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

如果发生了什么事情,并且-1永远不会变成真的呢

不可能

一个将结束在一个无限循环增加某人的设备温度和浪费CPU周期

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

怎么能肯定呢

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


注意:在您尝试读取并且没有出现异常或EOS之后,测试套接字或输入流是否为空是徒劳的。

“我们依赖于其他人的代码。”任何时候,您在为未编写BIOS的任何系统编程时,您都依赖于其他人的代码。(见鬼,即使你写了BIOS,CPU的微码仍然存在。)当你谈论套接字编程时。插座将超时。它可以用来阻止这种无限循环。你至少可以依赖
IOException
。如果-1永远不会变为真,那是你的JRE的问题,而不是你的问题。谢谢所有回复。不久前,当我第一次开始编程Android(去年12月)时,我正在试验套接字。这一定是我在学习Android和“多线程”的基础知识时编写的代码。当我在做上面展示的事情时,不知何故,我最终陷入了一个无限循环,但从那以后,我一直无法重现错误,我也记不清错误是什么。Log.e()一直在向我发送-1-1-1-1-1的垃圾邮件,因为我正在用Log.e()打印返回值,我有一段时间(true)决定很好地替换它,但read()在尝试读取超过EOF时不会引发异常。“NB在您尝试读取并且没有异常或EOS之后,测试套接字或输入流为null是徒劳的”-这是真的,代码是不合逻辑的。如果套接字在读取()之后立即变为null返回,下次循环运行时,它将抛出exceptrion@nwx“变空”是怎么回事?这才是真正的问题。变量不只是自发地“变空”。
try {
    int b;
    while ((b=inputStream.read() > -1)
    {
       //Do something
    }
} catch (IOException e) {
    e.printStackTrace();
}