2012-12-10 2 views
5

Я испытываю странное поведение с 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 решил мою проблему. Он работает для меня, как предложил Ян Робертс.

ответ

4

ZipFile пытается проанализировать «центральный каталог» в конце zip, чтобы создать структуру данных, которая позволяет вам получить доступ к отдельным записям по имени. ZipInputStream не делает этого, он смотрит только на локальный заголовок каждой записи, когда он читает файл сверху вниз. Таким образом, по какой-то причине ваш файл имеет хорошие записи, но поврежденный центральный каталог.

Существует ряд возможностей, например, проблемы с encoding of non-ASCII characters in entry names или если zip имеет более 64 тыс. Записей. Я бы попробовал реализацию ZipFile commons-compress - даже если он не работает, он должен дать вам более конкретное сообщение об ошибке, чем «что-то не так», которое вы получаете из java.util.zip.

+0

Я добавил сообщение об ошибке. – C4CodeE4Exe

+1

@ C4CodeE4Exe, это одна из проблем с реализацией zip-роли в Java, сообщения об ошибках не очень полезны ... Я добавил еще несколько идей. –

+0

Я пробовал использовать org.apache.commons.compress.archivers.zip.ZipFile, и он может показать мне записи, а не ошибки. Но некоторые исключения. Нет метода getName, записи были переименованы в getEntries, getEntries и getEntry возвращает org.apache.commons.compress.archivers.zip.ZipArchiveEntry экземпляры, закрытие разрешено вызывать исключение IOException. – C4CodeE4Exe

0

В дополнение к ответу Яна Роберта, если Java 7 является вариантом, вы можете обойти старые библиотеки java.util.zip в пользу использования the ZIP filesystem provider.

+0

Извините. Мы не используем Java 7 – C4CodeE4Exe

 Смежные вопросы

  • Нет связанных вопросов^_^