Разархивируйте данные в байтовом формате - PullRequest
1 голос
/ 20 февраля 2012

Я хочу распаковать zip-файл.У меня есть данные в виде байтов.Я использовал приведенный ниже код, чтобы распаковать zip-файл.Но я могу прочитать имена из файлов в zip-файле.Но выходные данные повреждены.Я думаю, что я читаю все данные в ZipInputStream.Как я могу прочитать данные каждого файла?Пожалуйста, помогите мне Спасибо ..

ByteArrayInputStream binput = new ByteArrayInputStream(zipeddatainbyte);
    ZipInputStream mzipstream = new ZipInputStream(binput);
    File f2 = new File("/sdcard/Unziped Data/");
    f2.mkdirs();
    ZipEntry entry;
    FileOutputStream out;
    byte[] bout=null;
    try {
        while ((entry = mzipstream.getNextEntry()) != null) {
            System.out.println("entry: " + entry.getName() + ", "
                    + entry.getSize());
            bout=new byte[(int) entry.getSize()];
            mzipstream.read(bout);
            out = new FileOutputStream("/sdcard/Unziped Data/"+entry.getName());
            out.write(bout);
            out.close();



        }
    } catch (IOException e) {

        e.printStackTrace();
    }

1 Ответ

3 голосов
/ 20 февраля 2012

Вы не должны доверять entry.getSize (), но пытайтесь читать до конца потока для каждого ZipEntry и контролировать, что на самом деле читается. Это относится не только к ZipInputStreams, но и к любому Java InputStream. Этот фрагмент извлечен из здесь :

ZipEntry entrada;
while (null != (entrada=zis.getNextEntry()) ){
   System.out.println(entrada.getName());

   FileOutputStream fos = new FileOutputStream(entrada.getName());
   int leido;
   byte [] buffer = new byte[1024];
   while (0<(leido=zis.read(buffer))){
      fos.write(buffer,0,leido);
   }
   fos.close();
   zis.closeEntry();
}
...