Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Zip输出流动态缓冲区大小_Java_Zip_Zipinputstream_Zipoutputstream - Fatal编程技术网

Java-Zip输出流动态缓冲区大小

Java-Zip输出流动态缓冲区大小,java,zip,zipinputstream,zipoutputstream,Java,Zip,Zipinputstream,Zipoutputstream,我正在开发一个应用程序,该应用程序从一个zip文件中获取文件并将其放入另一个zip文件中,但如果源zip中有dir,则会失败,出现以下异常: 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

我正在开发一个应用程序,该应用程序从一个zip文件中获取文件并将其放入另一个zip文件中,但如果源zip中有dir,则会失败,出现以下异常:

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();
}
我尝试过不同的缓冲区大小,但没有帮助,我需要一种方法来获得动态缓冲区大小。 欢迎提供示例和链接

编辑:我更改了代码以使其可用

  • 利亚姆,首席执行官
    • 移动

      zos.closeEntry();
      
      在最内部循环之外,否则假设每个条目的长度不超过1024字节

      我想你的目录是第一个达到这个大小的条目


      顺便说一句,你也可以移动

      byte[] buffer = new byte[1024];
      

      到外部循环之前,以便只创建一次。

      哪一行有异常?顺便说一句:我也会在com.hachisoftware.mmi.system.util.ZipExtractToZip(util.java:26)的java.util.zip.zipoutptstream.closeEntry(未知源代码)上使用BufferedInputSTream(不是说它会解决问题),谢谢你,这很有效,我得到了一点压缩(1kb),但也没问题,如果你这样做,你只需要创建一次缓冲区,在外部循环之外。如果我要降低缓冲区大小,压缩zip会更多吗?流有自己的缓冲区,默认情况下是512字节。它不应该对压缩比有任何影响,只会影响性能。对于普通的磁盘流,8K-64K的缓冲区会稍微快一点,但是在您的情况下,我怀疑这是否重要(因为压缩/解压缩是最昂贵的)