Я предполагаю, что вы отправляете один вызов read()
и предполагаете, что он вернет все запрашиваемые вами данные. Потоки обычно не работают таким образом. Он будет блокироваться до тех пор, пока некоторые данные не будут доступны, но он не будет ждать, пока у него не будет достаточно данных для заполнения массива.
Обычно это означает циклический цикл. Например:
byte[] data = new byte[expectedSize];
int totalRead = 0;
while (totalRead < expectedSize)
{
int read = stream.read(data, totalRead, expectedSize-totalRead);
if (read == -1)
{
throw new IOException("Not enough data in stream");
}
totalRead += read;
}
Если вы не знаете, сколько байтов вы ожидаете, во-первых, вы, возможно, захотите все еще выполнить цикл, но на этот раз, пока read()
не вернет -1. Используйте буфер (например, 8 КБ) для чтения и записи в ByteArrayOutputStream
. Когда вы закончите чтение, вы можете получить данные из ByteArrayOutputStream
в виде байтового массива.