爪哇 - ZIP输出流动态缓冲区大小

问题描述:

我工作的应用程序,它从一个压缩文件需要,并把它们在其他,它的罚款文件,但如果没有在源目录ZIP它失败,出现以下异常:爪哇 - ZIP输出流动态缓冲区大小

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 1374 but got 1024 bytes) 

我用下面的代码:

public static void ZipExtractToZip(File inZip, File outZip) throws IOException 
{ 
    ZipInputStream zis = new ZipInputStream(new FileInputStream(inZip)); 
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outZip))); 
    byte[] buffer = new byte[1024]; 

    for (ZipEntry ze = zis.getNextEntry(); ze != null; ze = zis.getNextEntry()) 
    { 
     zos.putNextEntry(ze); 
     for (int read = zis.read(buffer); read != -1; read = zis.read(buffer)) { 
      zos.write(buffer, 0, read); 
     } 
     zos.closeEntry(); 
    } 

    zos.close(); 
    zis.close(); 
} 

我已经尝试了不同的缓冲区大小,但这样做没有帮助,我需要一种方式来获得一个动态的缓冲区大小。 欢迎举例和链接。

编辑:我改变了代码,使其可用

+0

哪条线有例外?顺便说一句:我也会使用BufferedInputSTream(不是它可以解决问题) – 2012-01-10 10:49:44

+0

at java.util.zip.ZipOutputStream.closeEntry(Unknown Source) \t at com.hachisoftware.mmi.system.Util.ZipExtractToZip(Util。 java:26) – 2012-01-10 10:53:09

移动

zos.closeEntry(); 

最内层循环外,否则我们假定你是每个条目不超过1024个字节长。

我猜你的目录是第一个这样大小的条目。


顺便说一句,您还可以在外环之前移动

byte[] buffer = new byte[1024]; 

如此它仅创建一次。

+0

我会尝试一下 – 2012-01-10 10:59:28

+0

谢谢,这个工作,我得到了一点压缩(1kb),但多数民众赞成 – 2012-01-10 11:01:32

+0

此外,如果你这样做,你只需要创建一次,在外部循环外的缓冲区。 – sje397 2012-01-10 11:03:07