Загрузка файлов Java иногда приводит к CRC - PullRequest
2 голосов
/ 20 июня 2010

Я написал код для автоматической загрузки пакета файлов с использованием 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 байтов была другой, где-то в середине файла. Я не понимаю, как это могло произойти, поскольку загружаемый файл не изменяется, и он читается байт за байтом с использованием входного потока. Есть идеи ??

Ответы [ 5 ]

2 голосов
/ 21 июня 2010

Вы также можете использовать Apache HttpClient, если не хотите обрабатывать потоковую передачу этой сущности самостоятельно.Это хорошо написанная и документированная библиотека.Существует несколько доступных классов доступных .

Здесь вы можете взглянуть на поиск сущности: http://hc.apache.org/httpcomponents-client-4.0.1/tutorial/html/fundamentals.html#d4e152

1 голос
/ 21 июня 2010

Вы должны запустить diff (инструмент Unix), сравнивая оригинал с результатом, чтобы выяснить, что на самом деле изменилось. Вы можете увидеть шаблон сразу.

0 голосов
/ 03 сентября 2010

Кажется, проблема в драйвере Linux atheros для моей сетевой карты.

0 голосов
/ 21 июня 2010

Ваш код верен при условии, что все закрыто и не выдается никаких исключений. Проблема кроется в другом месте, возможно, в оригинальных файлах.

0 голосов
/ 20 июня 2010

Я бы начал с очистки (или закрытия) FileOutputStream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...