簡體   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