Проблема со следующей частью вашего кода:
while ((bis.read(barray, 0, BUFFER_SIZE)) != -1) {
bos.write(barray, 0, BUFFER_SIZE);
}
Вы всегда записываете кратное BUFFER_SIZE
байтов, , даже если размер вашего ввода не кратен BUFFER_SIZE
. Это приводит к записи мусора в конце последнего блока.
Вы можете исправить это так:
int read;
while ((read = bis.read(barray, 0, BUFFER_SIZE)) != -1) {
bos.write(barray, 0, read);
}