Вы не можете гарантировать, что InputStream.read (byte [], int, int) действительно прочитает желаемое количество байтов: он может читать меньше. Даже ваш звонок в available () не дает такой гарантии. Вы должны использовать возвращаемое значение из fin.read
, чтобы узнать, сколько фактически было прочитано байтов, и записать только это количество в вывод.
Я полагаю, что проблема, которую вы видите, может быть связана с этим. Если чтение блока меньше доступного размера, ваш буфер будет частично заполнен, и это приведет к проблемам, когда вы запишете слишком много байтов в вывод.
Кроме того, не выделяйте новый массив каждый раз через цикл! Это приведет к огромному количеству ненужных выделений памяти, что замедлит ваш код и потенциально вызовет OutOfMemoryError, если available()
вернет большое число.
Попробуйте это:
int size;
int totalBytes = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while ((size = fin.read(buffer, 0, BUFFER_SIZE)) != -1) {
outStream.write(buffer, 0, size);
totalBytes += size;
}