BufferedInputStream表示它不可用,但无论如何都可以工作

时间:2012-07-13 15:39:48

标签: java sockets inputstream blocking bufferedinputstream

有人可以向我解释为什么这可以正常使用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()&gt; 0但是如果长度很大,则in.available()返回0但随着注释,一切都继续顺利进行。

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

2 个答案:

答案 0 :(得分:2)

in.available()让您知道您是否可以在不阻塞的情况下读取数据。由于套接字具有数据流,因此可能无法在短时间内立即使用。例如如果你有一个1 Gbit的连接,那么完整的数据包将不会超过15微秒,这对于计算机来说是很长的时间。

答案 1 :(得分:1)

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