【问题标题】:Why InputStream.read() returns -1?为什么 InputStream.read() 返回 -1?
【发布时间】:2015-01-25 18:38:09
【问题描述】:

我的 android 智能手机是 tcpclient,chipkit wf32 wifi 模块是我的 tcp 服务器。

int bytesRead;
InputStream inputStream = socket.getInputStream();

while ((bytesRead = inputStream.read(buffer)) != -1){
       byteArrayOutputStream.write(buffer, 0, bytesRead);
       response += byteArrayOutputStream.toString("UTF-8");
     }

上面的代码从流中读取数据并复制到缓冲区。如果没有数据到来,它将阻塞。但有时我得到-1。谁能解释得到-1的原因?在文档中提到“到达流的结尾”。但是你能解释一下它的含义吗?谢谢。

【问题讨论】:

  • 您是否考虑过查阅文档?在您发布之前?
  • 不是 javadoc 的忠实粉丝,不是吗?
  • 我读过。但我无法理解流结束的含义。你能解释一下吗?这是否意味着套接字断开连接或任何其他套接字问题?
  • 伙计们,我阅读了文件,然后才发布。但是从文档中看不懂..

标签: java android sockets networking


【解决方案1】:

如果您可以阅读文档,您会看到-1 表示流结束:
InputStream.read()

所以得到-1是很自然的。

【讨论】:

  • 我无法理解流结束的含义。你能解释一下吗?这是否意味着套接字断开或任何其他套接字问题?
  • 如果没有可用的数据,它应该阻塞,不是吗?但为什么它返回 -1?
  • block 是什么意思?流返回-1,让您知道它已经结束,因此您可以执行您认为必要的操作。通常只要返回值不是-1 就可以得到输入。我踩到使用google的第一个例子:http://www.tutorialspoint.com/java/io/inputstream_read.htm应该解释一下
  • 输入流与 Socket 相关联。如果我不发送任何数据,它通常会等待或阻塞,直到我发送数据。在文档中提到“阻塞直到读取一个字节”。但有时它返回-1。我可以理解文件输入流示例。但我不能将它与套接字输入流联系起来。对不起,我是 java 和 android 的新手。
【解决方案2】:

Oracle 说:

从输入流中读取数据的下一个字节。值字节是 返回为 0 到 255 范围内的 int。如果没有可用的字节 因为已经到达流的末尾,所以值 -1 是 回来。此方法阻塞,直到输入数据可用,结束 检测到流,或抛出异常。子类必须 提供此方法的实现。

返回: 数据的下一个字节,如果到达流的末尾,则为 -1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2012-01-25
    • 2012-03-05
    • 2017-06-04
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多