Java BufferedInputStream说它不可用,但仍然有效
有人能给我解释一下为什么在in.available()>0被注释掉的情况下这一切都很好,但是当我把它放回时,它就坏了Java BufferedInputStream说它不可用,但仍然有效,java,sockets,inputstream,blocking,bufferedinputstream,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 < len
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();
}
mySocket=新套接字(“blahblah”,12345);
BufferedInputStream in=新的BufferedInputStream(mySocket.getInputStream());
....
字符结果[]=新字符[长度];
对于(int i=0;i0*/;i++){
.read()中的结果[i]=(字符);
}
更具体地说:我正在制作一个Android应用程序,用户可以在其中搜索一个术语,该搜索被发送到interspace中的某个东西,我以xml形式返回结果,并对其进行处理。当我返回的xml足够小时(请参见上面代码中的“长度”),如果in.available()>0保留在in中,代码就可以正常工作。但如果长度较大,in.available()将返回0。但随着评论的结束,一切都继续顺利进行
为什么呢?这是我需要担心和解决的问题吗?in.available()让您知道是否可以在不阻塞的情况下读取数据。由于套接字有一个数据流,它可能不会立即可用,但会在短时间内可用。e、 g.如果您有1 Gbit连接,完整的数据包将不超过15微秒,这对于计算机来说是很长的时间。in.available()让您知道您是否可以在不阻塞的情况下读取数据。由于套接字有一个数据流,它可能不会立即可用,但会在短时间内可用。e、 g.如果您有一个1 Gbit连接,完整数据包将不超过15微秒,这对于计算机来说是很长的时间。我认为当数据很大时,.available()==0中的原因是因为它还没有机会将数据写入您的套接字。您不需要在.available()中使用。另外,我不建议一次只读取一个字符,这将非常慢,数据量很大,而且在网络上非常健谈。考虑在长度为“长度”的字节数组中进行读取。< P>我认为当数据大时,在.Abvabl()= 0的原因是因为它还没有机会将它写入到套接字中。您不需要在.available()中使用。另外,我不建议一次只读取一个字符,这将非常慢,数据量很大,而且在网络上非常健谈。考虑在长度为“长度”的字节数组中进行读取。您也应该删除ISCOLD()测试。它不会做你想做的事情:它只会告诉你你是否自己关上了插座。这不是EOS测试:返回-1的read()告诉您这一点。如果您自己关闭了套接字,那么首先就不应该接近此代码。您还应该删除isClosed()测试。它不会做你想做的事情:它只会告诉你你是否自己关上了插座。这不是EOS测试:返回-1的read()告诉您这一点。如果您自己关闭了套接字,那么首先就不应该接近此代码。