Распаковка ZIP-файла с использованием класса Java ZipFile - PullRequest
3 голосов
/ 23 марта 2012

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

Структура файла является правильной после того, как файл распакован, это означает, что каталоги в 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 (entry) возвращает ноль байтов, точно не знаю, почему.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

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

Вместо:

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

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

InputStream in = zip.getInputStream ( entry );

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

0 голосов
/ 23 марта 2012

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

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» с помощью «new File (complete_path + filename)».Если вы просто создаете с именем файла, оно не работает.

...