Я написал код для автоматической загрузки пакета файлов с использованием InputStream и FileOutputStream.
Код очень прост:
is = urlConn.getInputStream();
fos = new FileOutputStream(outputFile);
eventBus.fireEvent(this, new DownloadStartedEvent(item));
int read;
byte[] buffer = new byte[2048];
while ((read = is.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
eventBus.fireEvent(this, new DownloadCompletedEvent(item));
На первый взгляд это работает очень хорошо, файлы скачиваются без проблем, однако,
иногда при попытке извлечь пакет загруженных rar-файлов происходит сбой при извлечении одной из частей rar с ошибкой CRC.
Поскольку это уже происходило несколько раз, хотя и не всегда, я начал подозревать, что что-то в этом коде не является правильным / оптимальным.
Будет полезно знать, что одновременно выполняется 4 загрузки с использованием механизма FixedThreadPool JDK:
execService.execute(new Runnable() {
@Override
public void run() {
if (item.getState().equals(DownloadCandidateState.WAITING)) {
Downloader downloader = new Downloader(eventBus);
downloader.download(item, item.getName());
}
}
});
Но поскольку каждый поток загрузки использует новый экземпляр класса Downloader, я считаю, что эта проблема не является побочным эффектом параллелизма?
Любые идеи, если эта случайная ошибка CRC связана с кодом или если это связано с чем-то еще?
UPDATE
Я могу убедиться, что размер проблемного файла правильный.
Я также сделал diff (в linux) для автоматически загружаемого файла и загруженного вручную файла.
Размер файла одинаков для обоих файлов, однако, diff говорит, что двоичное содержимое отличается между двумя файлами:
Двоичные файлы file.rar и file (2) .rar отличаются
ОБНОВЛЕНИЕ 2
Я использовал визуальный двоичный инструмент сравнения и увидел, что последовательность из 128 байтов была другой, где-то в середине файла. Я не понимаю, как это могло произойти, поскольку загружаемый файл не изменяется, и он читается байт за байтом с использованием входного потока. Есть идеи ??