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

发布于 2024-12-25 21:58:33 字数 1081 浏览 3 评论 0原文

我正在开发一个应用程序,该应用程序从一个 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();
}

我有尝试了不同的缓冲区大小,但这没有帮助,我需要一种方法来获取动态缓冲区大小。 欢迎提供示例和链接。

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

I'm working on application that takes files from one zip and put them in the other, its fine with files but if there is a dir in the source zip it fail with the following exception:

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

I'm using the following code:

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();
}

I have tried different buffer sizes but that doesn't help, I need a way to get a dynamic buffer size.
Examples and links are welcome.

EDIT: I changed the code to make it usable

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一梦等七年七年为一梦 2025-01-01 21:58:33

移到

zos.closeEntry();

最内层循环之外,否则您将假设每个条目的长度不超过 1024 字节。

我猜您的目录是该大小的第一个条目。


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

byte[] buffer = new byte[1024];

到外循环之前,这样它就只创建一次。

Move

zos.closeEntry();

outside the inner most loop, otherwise you are assuming each entry is no more than 1024 bytes long.

I am guess your directory is the first entry to be that size.


BTW, You can also move

byte[] buffer = new byte[1024];

to before the outer loop so it is created only once.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文