【问题标题】:BufferedInputStream says it is not available, but works anywayBufferedInputStream 说它不可用,但仍然有效
【发布时间】:2012-07-13 11:57:05
【问题描述】:

有人可以向我解释为什么在注释掉 in.available()>0 的情况下它可以正常工作,但是当我把它放回去时它会中断?

mySocket = new Socket("blahblah", 12345);
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
....
char result[] = new char[length];       
for (int i = 0; i < length && !mySocket.isClosed() /*&& in.available()>0*/; i++){
    result[i] = (char)in.read();
}

更具体地说:我正在制作一个 Android 应用程序,用户可以在其中搜索一个词,该搜索被发送到空间中的某个东西,我以 xml 形式返回结果,并用它们做一些事情。当我返回的 xml 足够小时(参见上面代码中的“长度”),代码在 in.available()>0 的情况下工作得很好。但如果长度很大,in.available() 返回 0。但是在注释掉之后,一切都会继续顺利进行。

这是为什么呢?这是我需要担心和解决的问题吗?

【问题讨论】:

  • 您还应该删除 isClosed() 测试。它不会像你想的那样做:它只会告诉你是否自己关闭了套接字。这不是 EOS 测试:返回 -1 的 read() 告诉你。如果您自己关闭了套接字,那么您首先不应该靠近此代码。

标签: java sockets inputstream blocking bufferedinputstream


【解决方案1】:

in.available() 让您知道您是否可以在那一刻读取数据而不会阻塞。由于 Socket 有数据流,它可能不会立即可用,但会在很短的时间内可用。例如如果你有一个 1 Gbit 的连接,完整的数据包不会小于 15 微秒,这对于计算机来说是很长的时间。

【讨论】:

    【解决方案2】:

    我认为数据很大时 in.available() == 0 的原因是因为它还没有机会将其写入您的套接字。您不需要使用 in.available()。另外,我不建议一次读取一个字符,因为有大量数据并且在网络上非常健谈,这会非常慢。考虑读取大小为“length”的字节数组。

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2015-02-21
      相关资源
      最近更新 更多