Я испытываю странное поведение с java.util.zip. *ZipFile бросает ошибку, но ZipInputStream может распаковать архив
У меня есть почтовый файл и на распаковку follwing tihngs случаются
ZipFile zipfile = new ZipFile(file, ZipFile.OPEN_READ);
Это сообщение об ошибке exaxt
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.zip.ZipFile.<init>(ZipFile.java:143)
at com.basware.ExtractZip.unpack(ExtractZip.java:27)
at com.basware.ExtractZip.main(ExtractZip.java:17)
Но если я использую следующий код, он может открыть архив без каких-либо ошибок
try {
BufferedOutputStream dest = null;
File file = new File("File_Path");
FileInputStream fis = new FileInputStream(file);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
FileOutputStream fos = new
FileOutputStream(entry.getName());
dest = new
BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER))
!= -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
Обратите внимание, что файлы сжимаются с использованием WinZIP.
Мой вопрос в том, что ZipFile и ZipInputStream почти такие же, почему ZipFile дает исключение и почему он не может выполнить декомпрессию.
EDIT: Проблема в том, что если я заархивирую файл с помощью инструмента WinZip, а затем распакую его, используя указанную программу, он работает нормально. Но эта проблема особенно подходит для архивов, поступающих из внешнего источника (внешние источники утверждают, что они используют WinZip). Наверху, если я открою тот же архив (внешний), используя инструмент WinZip, он показывает и распаковывает файлы. Но этот JAVA-код (ZipFile) вообще не работает.
EDIT: Я не могу понять, почему родной код Java не работает для моих ZIP-архивов, но apache compress решил мою проблему. Он работает для меня, как предложил Ян Робертс.
Я добавил сообщение об ошибке. – C4CodeE4Exe
@ C4CodeE4Exe, это одна из проблем с реализацией zip-роли в Java, сообщения об ошибках не очень полезны ... Я добавил еще несколько идей. –
Я пробовал использовать org.apache.commons.compress.archivers.zip.ZipFile, и он может показать мне записи, а не ошибки. Но некоторые исключения. Нет метода getName, записи были переименованы в getEntries, getEntries и getEntry возвращает org.apache.commons.compress.archivers.zip.ZipArchiveEntry экземпляры, закрытие разрешено вызывать исключение IOException. – C4CodeE4Exe