у нас есть часть кода, который генерирует 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-файл?
Вы можете использовать класс класса
класс для проверки вашего файла:
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) {
}
}
}
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();
Я думаю, что вы увидите трассировку стека исключения корреспонденты во время поколения почтового файла. Итак, вы, вероятно, не хотите улучшить вашу обработку исключения.
Может быть, поменяем местами следующие две строки?;
fis.close();
zos.closeEntry();
Могу себе представить, что closeEntry() все-таки прочитает некоторые данные из потока.
Ваш код в основном в порядке, попробуйте выяснить, какой файл отвечает за поврежденный zip-файл. Проверьте, всегда ли digitalFile.getFile() возвращает правильный и доступный аргумент в FileInputStream. Просто добавьте немного логирования к вашему коду и вы узнаете, что не так.