Java InputStream.read(byte [],int,int)方法,如何阻塞,直到读取了确切的字节数

时间:2011-08-20 11:16:35

标签: java inputstream

我正在编写一个简单的客户端/服务器网络应用程序,通过TCP套接字发送和接收固定大小消息。

到目前为止,我一直在使用getInputStream()类的getOutputStream()Socket方法来获取流,然后调用{read(byte[] b, int off, int len)方法InputStream 1}}类每次读取60个字节(这是消息的大小)。

稍后,我阅读了该方法的Javadoc:

  

public int read(byte [] b,          int off,          int len)            抛出IOException

     

将输入流中最多 len个字节的数据读入数组   字节。尝试读取len个字节,但更小   号码可以阅读。实际读取的字节数返回为   一个整数。

我想知道是否有任何Java“开箱即用”的解决方案要阻止,直到 len 字节被读取,必要时永远等待。

我显然可以创建一个简单的循环,但我觉得我正在重新发明轮子。你能建议我一个干净的Java感知解决方案吗?

4 个答案:

答案 0 :(得分:25)

使用DataInputStream.readFully。这是JavaDoc

InputStream in = ...
DataInputStream dis = new DataInputStream( in );
byte[] array = ...

dis.readFully( array );

答案 1 :(得分:2)

简单的循环是要走的路。鉴于您正在交换的字节数非常少,我想它只需要一次迭代即可读取所有内容,但如果您想使其正确,则必须循环。

答案 2 :(得分:0)

一个简单的单行将会做到这一点

int toread = 60;
byte[] buff;
for(int index=0;index<toread;index+=in.read(buff,index,toread-index));

但是大部分时间读取字节数的唯一原因是当流结束或者字节没有全部在另一端刷新时

答案 3 :(得分:0)

我认为正确版本的棘轮怪物的答案是:

for (int index = 0; index < toRead && (read = inputStream.read(bytes, index, toRead-index))>0 ; index+= read);

如果读取返回-1

,它将停止读取