Вы неправильно читаете поток, игнорируя фактическое число прочитанных байтов, возвращенное методом read
.Это приводит к ошибочным ошибкам в количестве записываемых вами байтов, что приводит к повторению байтов из предыдущих операций чтения и повреждению вашего записанного файла.
Вам необходимо изменить код на:
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
Обратите внимание, что я также увеличил размер буфера, так как это будет более эффективно, чем чтение на два байта.
Ваш код можно еще больше упростить, используя try-with-resources для закрытия потоков.
Или, еще более кратко, не создавайте выходной поток, а вместо этого используйте:
Files.copy(input, file.toPath());
Файлы могут все еще быть неправильными, так как возможно, что вы допустили схожие ошибки при записи файла.