我想将普通文件压缩为.zip,然后将其压缩为gzip文件,而不创建新文件。
例如,假设我有一个pdf文档 doc.pdf ,我必须得到的是:doc.pdf.zip.gz
doc.pdf.zip.gz
我不想创建一个名为的新文件doc.pdf.zip,然后将其打开并gzip。
doc.pdf.zip
我正在与服务器一起从浏览器获取文件并将其返回,这是我的功能:
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并且没有压缩,为什么?
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(); } }
希望能帮助到你。