当前位置: 首页 > 面试题库 >

如何在Java中将.zip压缩为.gz?

白智
2023-03-14
问题内容

我想将普通文件压缩为.zip,然后将其压缩为gzip文件,而不创建新文件。

例如,假设我有一个pdf文档 doc.pdf ,我必须得到的是:doc.pdf.zip.gz

我不想创建一个名为的新文件doc.pdf.zip,然后将其打开并gzip。

我正在与服务器一起从浏览器获取文件并将其返回,这是我的功能:

 public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException
 {
    File file = new File(fileName);
    FileInputStream fis = new FileInputStream(file);
    byte[] data = new byte[(int) file.length()];
    DataOutputStream dos = new DataOutputStream(os);
    try {
        dos.writeBytes(header);
        ZipOutputStream zpos = new ZipOutputStream(os); 
        zpos.putNextEntry(new ZipEntry(fileName));
        GZIPOutputStream gos = (new GZIPOutputStream(zpos));
        fis.read(data);
        gos.write(data);

        zpos.flush();
        zpos.close();
        gos.flush();
        gos.close();
        dos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

我得到了一个文件,doc.pdf.zip.gz但是它有一个损坏的文件doc.pdf并且没有压缩,为什么?


问题答案:

我认为您可以为zip创建一个临时文件,将其添加到gzip,然后删除创建的zip。下面的代码示例应该可以帮助您。

public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException {
    byte[] buffer = new byte[1024];
    FileInputStream fis = null;
    FileOutputStream fos = null;
    ZipOutputStream zos = null;
    File tempZipFile = File.createTempFile(fileName, ".zip")
    try {
        fos = new FileOutputStream(tempZipFile);
        zos = new ZipOutputStream(fos);
        ZipEntry ze = new ZipEntry(fileName);
        zos.putNextEntry(ze);
        fis = new FileInputStream(fileName);

        int len;
        while ((len = fis.read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }
        zos.closeEntry();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (fis != null) {
            fis.close();
        }
        if (zos != null) {
            zos.close();
        }
        if (fos != null) {
            fos.close();
        }
    }

    addGzipFileToStream(tempZipFile, os, header);
}

private void addGzipFileToStream(File zipFile, OutputStream os, String header) throws FileNotFoundException {

    byte[] buffer = new byte[1024];
    DataOutputStream dos = null;
    GZIPOutputStream gzos = null;
    FileInputStream inputStream = null;
    try {
        dos = new DataOutputStream(os);
        dos.writeBytes(header);

        gzos = new GZIPOutputStream(os);
        inputStream = new FileInputStream(zipFile);

        int len;
        while ((len = inputStream.read(buffer)) > 0) {
            gzos.write(buffer, 0, len);
        }
        gzos.finish();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
        if (gzos != null) {
            gzos.close();
        }
        if (dos != null) {
            dos.close();
        }
        zipFile.delete();
    }
}

希望能帮助到你。



 类似资料:
  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:

  • 我正在为嵌套在其他一些面板中的面板使用垂直BoxLayout。其他面板的大小会导致目标面板中的对象以不美观的方式展开。如何让面板在没有太多填充的情况下从上到下呈现对象? 下面是类似的代码,尽管它产生了填充整个面板的微调器,而不是相距甚远的普通微调器。

  • 我试图压缩字符串上转换的Xml列表,将它们保存在一个zip文件中,并在restful上作为POST的主体返回。但是每次我保存文件时,都会出现错误“存档格式未知或损坏”。 有人能帮我吗?

  • 我有许多zip文件,我需要分发给用户,大约130个。每个zip文件包含许多类似的文本、html、xml和jpg文件。zip文件总计146兆字节;解压缩后,它们的内容总计551MB。 我想以尽可能小的格式将所有这些文件一起分发给用户。我研究了两种不同的方法,每种方法都使用两种不同的压缩方案,zip和7zip(我理解它要么是LZMA要么是其变体): 将所有zip文件压缩到一个压缩文件中,并发送该文件(

  • 问题内容: 我使用GZIPOutputStream或ZIPOutputStream压缩了一个字符串(我string.length()小于20),但是压缩后的结果比原始字符串长。 在某个站点上,我发现一些朋友说这是因为我的原始字符串太短,GZIPOutputStream可用于压缩较长的字符串。 因此,有人可以帮我压缩字符串吗? 我的功能是这样的: 更新: 问题答案: 压缩算法几乎总是具有某种形式的空

  • 我有多个zip文件在一个文件夹和另一个zip文件存在于每一个这些zip文件夹。我想解压第一个和第二个zip文件夹,并创建它们自己的目录。 这是结构 如上所示,在中,我们有多个zip文件,在每个zip文件中,都存在另一个zip文件。我想解压缩,,和到新的文件夹中。我想使用与父zip文件夹相同的名称来放置每个结果。我尝试了以下答案,但这只解压缩第一个文件夹。 顺便说一句,我在Jenkins管道中运行这