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

How to compress a .zip to a .gz in java?

我想将普通文件压缩为 .zip,然后在不创建新文件的情况下将其压缩为 gzip 文件。

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

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

我正在使用服务器从浏览器获取文件并return返回,这是我的功能:

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

希望对您有所帮助。