Java InputStream.read (byte [], int, int) метод, как блокировать, пока не будет прочитано точное количество байтов - PullRequest
10 голосов
/ 20 августа 2011

Я пишу простое клиент-серверное сетевое приложение, которое отправляет и получает сообщения фиксированного размера через сокет TCP.

До сих пор я использовал getInputStream()и getOutputStream() методы класса Socket для получения потоков, а затем вызов метода read(byte[] b, int off, int len) класса InputStream для чтения 60 байтов каждый раз (что является размером сообщения).

Позже я прочитал Javadoc для этого метода:

public int read (byte [] b, int off, int len) выдает IOException

Читает до длина байтов данных из входного потока в массив байтов.Предпринята попытка прочитать как длина байтов , но можно прочитать меньшее число .Количество фактически прочитанных байтов возвращается как целое число.

Мне было интересно, есть ли какое-либо "нестандартное" Java-решение для блокировки до тех пор, пока len байтов не будетПрочитано, ожидая вечно, если необходимо.

Я, очевидно, могу создать простой цикл, но я чувствую, что заново изобретаю колесо.Можете ли вы предложить мне чистое решение с поддержкой Java?

Ответы [ 4 ]

25 голосов
/ 20 августа 2011

Использовать DataInputStream.readFully.Вот JavaDoc

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

dis.readFully( array );
2 голосов
/ 20 августа 2011

Простой цикл - это путь. Учитывая очень небольшое количество байтов, которыми вы обмениваетесь, я полагаю, что потребуется всего одна итерация, чтобы прочитать все, но если вы хотите исправить это, вы должны выполнить цикл.

0 голосов
/ 04 февраля 2017

Я думаю, что правильный ответ фриката с трещоткой таков:

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

он перестает читать, если чтение возвращает -1

0 голосов
/ 20 августа 2011

простой для однострочника будет делать трюк

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

, но большую часть времени единственная причина, по которой будет прочитано меньше байтов, это когда поток заканчивается или байты не сброшеныдругая сторона

...