繁体   English   中英

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

[英]Java InputStream.read(byte[], int, int) method, how to block until the exact number of bytes has been read

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

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

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

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

将输入流中最多 len个字节的数据读入一个字节数组。 尝试读取len个字节, 但可以读取较小的数字 实际读取的字节数以整数形式返回。

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

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

使用DataInputStream.readFully。 这是JavaDoc

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

dis.readFully( array );

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

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

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

如果read返回-1,它将停止读取

一个简单的单行程将成功

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

但大多数时候,读取较少字节的唯一原因是当流结束或者字节没有全部被刷新到另一端时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM