当前位置: 首页 > 知识库问答 >
问题:

无法打开生成的zip文件

叶翰林
2023-03-14

我跟随了几篇文章,使用javaZipOutputStreamclass创建了一个zip文件。拉链已创建,但我无法打开它。在我的Mac电脑上,当我用unzip命令打开它时,我收到了这条消息:

找不到中央目录签名的结尾。此文件不是zipfile,或者它构成多部分存档的一个磁盘。在后一种情况下,将在此存档的最后一个磁盘上找到中心目录和zipfile注释。

解压:在/Users/xxxx/Downloads/iad之一中找不到zipfile目录。zip或
/Users/xxxx/Downloads/iad。拉链zip,无法找到/Users/xxxx/Downloads/iad。拉链ZIP,句号。

我的java类:

import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import static java.util.Arrays.stream;

@Slf4j
@UtilityClass
public class ZipCreator {

    public byte[] compressAll(String... files) throws IOException {

        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
             ZipOutputStream zipOut = new ZipOutputStream(baos)) {

            stream(files)
                    .forEach(file -> addToZip(zipOut, file));

            return baos.toByteArray();
        }
    }

    private static void addToZip(ZipOutputStream zipOut, String file) {
        File fileToZip = new File(file);
        try (FileInputStream fis = new FileInputStream(fileToZip.getCanonicalFile())) {
            zipOut.putNextEntry(new ZipEntry(fileToZip.getName()));

            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
        } catch (IOException e) {
            log.error("Error when adding file {} to zip", file, e);
        }
    }
}

有人有办法把拉链打开吗?

共有1个答案

贲招
2023-03-14

您忘记调用CloseEntry()。在baos.toByteArray()之前,您应该为ZipOutputStream调用近距离():

public static byte[] compressAll(String... files) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (ZipOutputStream zipOut = new ZipOutputStream(baos)) {
        stream(files).forEach(file -> addToZip(zipOut, file));
    }
    return baos.toByteArray();
}

private static void addToZip(ZipOutputStream zipOut, String file) {
    File fileToZip = new File(file);
    try (FileInputStream fis = new FileInputStream(fileToZip.getCanonicalFile())) {
        zipOut.putNextEntry(new ZipEntry(fileToZip.getName()));

        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zipOut.write(bytes, 0, length);
        }

        zipOut.closeEntry();
    } catch (IOException e) {
        log.error("Error when adding file {} to zip", file, e);
    }
}

对于ByteArrayOutputStream,您必须在从ByteArrayOutputStream检索字节数组之前关闭ZipOutputStream。对于FileOutputStream是相同的。您必须在关闭FileOutputStream之前关闭ZipOutputStream。请注意,资源的关闭方法是按照其创建的相反顺序调用的。

public static void compressAll(String... files) throws IOException {
    try (FileOutputStream fos = new FileOutputStream("test.zip");
         ZipOutputStream zipOut = new ZipOutputStream(fos)) {
        stream(files).forEach(file -> addToZip(zipOut, file));
    }
}
 类似资料:
  • 我的服务器中有一个zip文件,我想为用户创建一个下载按钮,下面是我的代码: 下面是我的JS代码: 当我单击“a”元素(downloadLink)时,我可以下载zip文件,但当我尝试打开它时,我会收到一个错误,上面写着: 错误:不是存档警告:标题错误 从服务器的zip文件是100%罚款,我可以打开它没有任何问题,问题是当我从我的网站下载它,所以我认为有一些我是理所当然的。任何帮助都很感激,谢谢。

  • 问题内容: 我是android开发和android studio IDE的新手。 我从bitbucket中签出了一个项目,当我尝试对其进行编译时,出现以下错误: 无法完成Gradle执行 原因:打开zip文件时出错。 我的如下: distributionBase = GRADLE_USER_HOME distributionPath =包装器/ dists zipStoreBase = GRADL

  • 我是android开发和android studio IDE的新手。 无法完成Gradle执行 原因:打开zip文件时出错。 我的如下所示: 有没有人能为我指出解决这个问题的正确方向?

  • 我有一个错误:PHP无法打开流:打开的文件太多。 我在这里查看了stackoverflow的各种答案,但我无法解决这个问题。我主要尝试增加最大打开文件数的限制: 我已编辑/等/安全/限制。conf,其中我指定了: 保存并注销/重新启动该框后,命令: 仍打印出1024个。我不知道为什么这没有效果,我想这就是我得到php错误的原因。如果需要,我可以粘贴整个文件或任何其他配置文件。我使用的是PHP 5.

  • 问题内容: 我有一个Jar文件,其中包含其他嵌套的Jar。当我在该文件上调用新的构造函数时,出现一个异常: java.util.zip.ZipException:打开zip文件时出错 当我手动解压缩此Jar文件的内容并再次将其压缩时,它可以正常工作。 我仅在WebSphere 6.1.0.7和更高版本上看到此异常。相同的东西在tomcat和WebLogic上也可以正常工作。 当我使用JarInpu

  • 好的,所以最近我一直在尝试在Android Studio(1.1.0)上运行我的应用程序,但是每次尝试运行的时候,都会弹出以下错误: 注意:我最近导入了一个jar文件,从那以后,问题就开始了。不确定这是否重要。