Как проверить, повреждается ли сгенерированный zip-файл?

у нас есть часть кода, который генерирует zip-файл в нашей системе. Все в порядке, но иногда этот zip-файл, в то время как открыто FilZip или WinZip считается поврежденным.

Таким образом, вот мой вопрос: как мы можем проверить программно, если сгенерированный zip-файл повреждается?

Вот код, который мы используем для генерации наших zip-файлов:

try {
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tmpFile));
    byte[] buffer = new byte[16384];
    int contador = -1;
    for (DigitalFile digitalFile : document.getDigitalFiles().getContent()) {
       ZipEntry entry = new ZipEntry(digitalFile.getName());
       FileInputStream fis = new FileInputStream(digitalFile.getFile());
       try {
          zos.putNextEntry(entry);
          while ((counter = fis.read(buffer)) != -1) {
             zos.write(buffer, 0, counter);
          }
          fis.close();
          zos.closeEntry();
       } catch (IOException ex) {
          throw new OurException("It was not possible to read this file " + arquivo.getId());
       }
    }
    try {
      zos.close();
    } catch (IOException ex) {
      throw new OurException("We couldn't close this stream", ex);
    }

Есть ли что-нибудь, что мы делаем неправильно здесь?

Править: На самом деле код выше абсолютно в порядке. Моя проблема состояла в том, что я перенаправлял НЕПРАВИЛЬНЫЙ поток для своих пользователей. Так, вместо того, чтобы открыть zip-файл они, где открытие чего-то совершенно другого. Моя вина :(

НО основной вопрос остается: как программно я могу проверить, не повреждается ли данный zip-файл?

26
задан Bobby 21 December 2012 в 13:00
поделиться

5 ответов

Вы можете использовать класс класса класс для проверки вашего файла:

 static boolean isValid(final File file) {
    ZipFile zipfile = null;
    try {
        zipfile = new ZipFile(file);
        return true;
    } catch (IOException e) {
        return false;
    } finally {
        try {
            if (zipfile != null) {
                zipfile.close();
                zipfile = null;
            }
        } catch (IOException e) {
        }
    }
}
28
ответ дан 28 November 2019 в 07:16
поделиться

ZipoutputStream не закрывается Базовый поток.

Что нужно сделать:

FileOutputStream fos = new FileOutputStream(...);
ZipOutputStream zos = new ZipOutputStream(fos);

Тогда в вашем закрывающем блоке:

zos.close();
fos.flush(); // Can't remember whether this is necessary off the top of my head!
fos.close();
0
ответ дан 28 November 2019 в 07:16
поделиться

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

3
ответ дан 28 November 2019 в 07:16
поделиться

Может быть, поменяем местами следующие две строки?;

fis.close();
zos.closeEntry();

Могу себе представить, что closeEntry() все-таки прочитает некоторые данные из потока.

1
ответ дан 28 November 2019 в 07:16
поделиться

Ваш код в основном в порядке, попробуйте выяснить, какой файл отвечает за поврежденный zip-файл. Проверьте, всегда ли digitalFile.getFile() возвращает правильный и доступный аргумент в FileInputStream. Просто добавьте немного логирования к вашему коду и вы узнаете, что не так.

1
ответ дан 28 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: