javaserverzipgzipoutputstream

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


I want to compress a normal file to a .zip and then compress it as gzip file without creating a new file.

For example let's say that I have a pdf document doc.pdf, what I have to get is: doc.pdf.zip.gz

I don't want to creat a new file called doc.pdf.zip and then open it and gzip it.

I'm working with a server to get the file from the browser and return it back, this is my function:

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

I get a file doc.pdf.zip.gz but it has a corrupted file doc.pdf and not zipped why??


Solution

  • I think you can create a temporary file for the zip add it to gzip and then delete the zip that was created. The below code sample should help you with that.

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

    Hope it helps.