2012-03-22 3 views
3

У меня проблема с сжатием ZIP-файла с использованием Java. Метод приведен ниже.Сжатие ZIP-файла с использованием Java ZipFile class

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

Я проверил файл ZIP, чтобы проверить, правильно ли выполнено сжатие.

Пожалуйста, если кто-то видит что-то я пропустил ...

public static void unzip (File zipfile, File directory) throws IOException { 
    ZipFile zip = new ZipFile (zipfile); 
    Enumeration<? extends ZipEntry> entries = zip.entries(); 

    while (entries.hasMoreElements()) { 
    ZipEntry entry = entries.nextElement(); 
    File file = new File (directory, entry.getName()); 

    if (entry.isDirectory()) { 
     file.mkdirs(); 
    } 
    else { 
     file.getParentFile().mkdirs(); 

     ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
     OutputStream out = new FileOutputStream (file); 
     byte[] buffer = new byte[4096]; 
     int readed = 0; 

     while ((readed = in.read (buffer)) > 0) { 
     out.write (buffer, 0, readed); 
     out.flush(); 
     } 

     out.close(); 
     in.close(); 
    } 
    } 

    zip.close(); 
} 

Что-то еще ... По-видимому, метод getInputStream (запись) возвращает ноль байт, не знаю, почему именно.

+0

Вы пробовали какую-то отладку? Вызывает ли вызов in.read() несколько байтов или нет? – leonbloy

+0

Не смывайте внутри петли. – EJP

ответ

2

ZipFile уже распаковывает данные записи, нет необходимости использовать ZipInputStream.

Вместо:

ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 

Использование:

InputStream in = zip.getInputStream (entry); 

ZipInputStream могут быть использованы для распаковывать ZIP файлы. Причина, по которой вы получаете потоки нулевой длины, потому что с помощью ZipInputStream вам нужно вызвать getNextEntry(), чтобы прочитать первый файл в ZIP.

+0

Спасибо, действительно, это была проблема ... Попытка сжать сжатый поток. –

-1

Следующий код работает:

package so; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipInputStream; 

public class TestZip { 

    public static void main(String[] args) { 
     String path = "C:" + File.separator + "tmp" + File.separator; 
     String nom = "demo.zip"; 
     File zipfile = new File(path + nom); 
     File directory = new File(path); 
     TestZip m = new TestZip(); 
     try { 
      m.unzip(zipfile, directory); 
     } catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
    } 

    public static void unzip (File zipfile, File directory) throws IOException { 
     System.out.println(zipfile.toString()); 
     System.out.println(directory.toString()); 
      ZipFile zip = new ZipFile ( zipfile); 
      System.out.println("1"); 
      Enumeration<? extends ZipEntry> entries = zip.entries(); 
      System.out.println("2"); 

      while (entries.hasMoreElements()) { 
       System.out.println("3"); 
      ZipEntry entry = entries.nextElement(); 
      File file = new File (directory, entry.getName()); 

      if (entry.isDirectory()) { 
       file.mkdirs(); 
      } 
      else { 
       file.getParentFile().mkdirs(); 

       ZipInputStream in = new ZipInputStream (zip.getInputStream (entry)); 
       OutputStream out = new FileOutputStream (file); 
       byte[] buffer = new byte[4096]; 
       int readed = 0; 

       while ((readed = in.read (buffer)) > 0) { 
       out.write (buffer, 0, readed); 
       out.flush(); 
       } 

       out.close(); 
       in.close(); 
      } 
      } 

      zip.close(); 
     } 


} 

Так что я думаю, что проблема с параметрами вы передаете. Создайте аргумент «zipfile» с «новым файлом (complete_path + filename)». Если вы просто создаете с именем файла, это не сработает.

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