РЕДАКТИРОВАТЬ: Для общего потока, вы просто продолжаете читать, пока вы не прочитаете все, что вы хотите, в основном. Для реализации DataInput
(например, DataInputStream
) вы должны использовать readFully
, как предложил Питер Лоури. Считайте, что остальная часть этого ответа важна для общего случая, когда у вас просто есть InputStream
.
Это полностью разумно, если InputStream
любого типа предоставит вам меньше данных, чем вы просили, даже если их будет больше. Вы должны всегда кодировать эту возможность - с возможным исключением ByteArrayInputStream
. (Конечно, это может вернуть меньше данных, чем было запрошено, если осталось данных меньше, чем вы запрашивали.)
Вот такая петля, о которой я говорю:
byte[] data = new byte[messageSize];
int totalRead = 0;
while (totalRead < messageSize) {
int bytesRead = stream.read(data, totalRead, messageSize - totalRead);
if (bytesRead < 0) {
// Change behaviour if this isn't an error condition
throw new IOException("Data stream ended prematurely");
}
totalRead += bytesRead;
}