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

无法在Java/Groovy中创建zip文件

逄宁
2023-03-14

我尝试了多种方法来创建这个zip文件在Java /Groovy.我尝试的前几个方法,来自各种博客/帖子,导致无法打开损坏的zip文件。所以,我尝试了这个(下图),看起来相当有希望。系统报告传递到FileInputStream的有效文件路径。我不确定是否是FQ路径被传递到ZipOutputStream导致了这个问题。不管怎样,下面是代码,它导致创建小(188kb)zip文件(没有条目)。有什么建议吗?

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

class FileZipper {

    public static void makeZip(Set fullyQualifiedFileNames, String zipFileName, String outDir) throws IOException, FileNotFoundException
    {
        // These are the files to include in the ZIP file
        Object[] filenames = fullyQualifiedFileNames.toArray();
        String fileSeparator =  (String) System.getProperties().get("file.separator");

        // Create a buffer for reading the files
        byte[] buf = new byte[1024];

        // Create the ZIP file
        String outFilename = outDir + fileSeparator +zipFileName;
        FileOutputStream fos = new FileOutputStream(outFilename);
        ZipOutputStream zos = new ZipOutputStream(fos);
        System.out.println("Zipping to file " +outFilename);
        // Compress the files

        for (Object fileName: filenames)
        {
            System.out.println("Adding file: " + fileName);
            FileInputStream fis = new FileInputStream((String)fileName);

            // Add ZIP entry to output stream.
            String[] nodes = ((String)fileName).split("[/[\\\\]]");
            String zipEntry = nodes[nodes.length-1];
            System.out.println("Adding Zip Entry: " + zipEntry);
            zos.putNextEntry(new ZipEntry((String)fileName));

            // Transfer bytes from the file to the ZIP file
            int len;
            int totalBytes = 0;
            while ((len = fis.read(buf)) > 0) 
            {
                totalBytes += len;
                zos.write(buf, 0, len);
            }
            System.out.println("Zipped " +totalBytes +" bytes");
            // Complete the entry
            zos.closeEntry();
            fis.close();
        }

        // Complete the ZIP file
        zos.close();
        fos.close();
    }
}

共有3个答案

淳于功
2023-03-14

我在本地运行了您的代码,创建并打开zip文件没有问题。

然而,我有时在使用默认的Java压缩实用程序时会遇到一些奇怪的问题,因此我开始使用ApacheCommons压缩程序,并从那时起使用它几乎没有什么困难。

查看http://commons.apache.org/compress/index.html了解基本概述,http://commons.apache.org/compress/examples.html了解具体示例

艾弘义
2023-03-14

您是否尝试过显式关闭底层FileOutputStream以确保所有数据都已刷新到磁盘?

FileOutputStream fos = new FileOutputStream(outFilename);
ZipOutputStream zos = new ZipOutputStream(fos);
...
zos.Close();
fos.Close();
魏君博
2023-03-14

如果您使用的是Groovy,最简单的方法是使用AntBuilder

new AntBuilder().zip(
   destfile: "myfile.zip",
   basedir: "baseDir")

或从Groovy 1.8开始:

ant.zip(destfile: 'file.zip', basedir: 'src_dir')
 类似资料:
  • 我正在使用java创建一个zip文件,但我无法得到任何代码工作。我尝试了很多特定于Java7和Java8的方法,但所有的方法都显示出某种错误,是我的代码中有错误还是需要改进? 在这一行出现错误 请指导我:) 运行时出错:

  • 本文向大家介绍Java中创建ZIP文件的方法,包括了Java中创建ZIP文件的方法的使用技巧和注意事项,需要的朋友参考一下 java创建zip文件的代码如下如下: 补充:下面看下JAVA中创建ZIP文件,并向ZIP文件中写入并读取条目和数据 总结 以上所述是小编给大家介绍的Java中创建ZIP文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐

  • 我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总

  • 我有一个来自不同位置的文件列表。我使用以下代码创建了一个zip文件,该代码可以正常工作。但是,当我尝试在Windows中使用Extract All解压文件时,无法找到任何字节,但是如果我使用Windows资源管理器双击zip文件本身,我可以看到文件,并且可以打开单个文件并包含正确的数据

  • 问题内容: 与此jar命令等效的Java是什么: 我想以编程方式创建此jar文件,因为我不确定命令是否位于我可以运行外部进程的系统路径上。 编辑 :我只想存档(和压缩)目录。不必遵循任何Java标准。即:标准拉链就可以了。 问题答案: // These are the files to include in the ZIP file String[] source = new String[]{“

  • 我试图使用在Java()压缩文件,但不能解压文件后创建它。我使用下面的代码: 当我读取一个文件,并将其作为InputStream输入到此方法时,它会创建一个文件。 但是,当我尝试使用命令打开这个zip文件时,它无法打开,错误如下: 我尝试使用,它起作用并显示包含文本文件。这是因为命令不会在zip文件中查找中心目录签名的