public class ZipUtil{ /** * 由於有zipModel的原因 * 故不建議使用static * */ private ZipModel zipModel = new ZipModel(); /* public static void main(String[] args) { ZipUtil util = new ZipUtil(); try { util.doZipEnc(); System.out.println("成功"); } catch (Exception e) { System.out.println("失敗"); e.printStackTrace(); } } public void doZipEnc() { try { // 將壓縮流寫到內存 // ZipOutputStream saos = new ZipOutputStream(new ByteArrayOutputStream(), this.zipModel); // 本地測試 FileOutputStream f = new FileOutputStream("C:/Users/Louis/Desktop/test1.zip" ,true); ZipOutputStream saos = new ZipOutputStream(f, this.zipModel); for(int i=0;i<2;i++){ ZipParameters parameters = createZipParameters("test" + i + ".txt", "" + i + i + i); addNewStreamToZip(saos, ("test" + i + ".txt").getBytes(), parameters); } // saos.writeTo(f); saos.finish(); saos.close(); f.close(); //文件大小 // System.out.println("size:" +(saos.toByteArray().length/1024)); } catch (Exception e) { e.printStackTrace(); } } */ public ZipOutputStream createZipOutputStream(OutputStream outputStream){ return new ZipOutputStream(outputStream, zipModel); } public void addNewStreamToZip(ZipOutputStream outputStream, InputStream data, ZipParameters parameters) throws ZipException { ByteArrayOutputStream tempOut = new ByteArrayOutputStream(); try{ byte[] buffer = new byte[1024]; for(int i ; (i = data.read(buffer)) != -1 ; ){ tempOut.write(buffer, 0, i); tempOut.flush(); } }catch (Exception e) { throw new ZipException(e); }finally{ try{ data.close(); tempOut.close(); }catch (Exception e) { } } addNewStreamToZip(outputStream, tempOut.toByteArray(), parameters); } public void addNewStreamToZip(ZipOutputStream saos, byte[] data, ZipParameters parameters) throws ZipException { try { if (zipModel.getEndCentralDirRecord() == null) { throw new ZipException("invalid end of central directory record"); } /* checkParameters(parameters); saos.putNextEntry(null, parameters); if (! parameters.getFileNameInZip().endsWith("/") && ! parameters.getFileNameInZip().endsWith("\\") ) { saos.write(data); } */ saos.putNextEntry(null, parameters); saos.write(data); saos.closeEntry(); } catch (ZipException e) { throw e; } catch (Exception e) { throw new ZipException(e); } } public ZipParameters createZipParameters(String fileNameInZip, String password){ ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 壓縮方式 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 壓縮等級 parameters.setSourceExternalStream(true); parameters.setFileNameInZip(fileNameInZip); // 若有多檔,password個別有效 if(password != null && ! password.trim().isEmpty()) { parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式 parameters.setPassword(password); } return parameters; } /* private void checkParameters(ZipParameters parameters) throws ZipException { if (parameters == null) { throw new ZipException("cannot validate zip parameters"); } if ((parameters.getCompressionMethod() != Zip4jConstants.COMP_STORE) && parameters.getCompressionMethod() != Zip4jConstants.COMP_DEFLATE) { throw new ZipException("unsupported compression type"); } if (parameters.getCompressionMethod() == Zip4jConstants.COMP_DEFLATE) { if (parameters.getCompressionLevel() < 0 && parameters.getCompressionLevel() > 9) { throw new ZipException("invalid compression level. compression level dor deflate should be in the range of 0-9"); } } if (parameters.isEncryptFiles()) { if (parameters.getEncryptionMethod() != Zip4jConstants.ENC_METHOD_STANDARD && parameters.getEncryptionMethod() != Zip4jConstants.ENC_METHOD_AES) { throw new ZipException("unsupported encryption method"); } if (parameters.getPassword() == null || parameters.getPassword().length <= 0) { throw new ZipException("input password is empty or null"); } } else { parameters.setAesKeyStrength(-1); parameters.setEncryptionMethod(-1); } } */ }
用法:
ZipUtil zipUtil = new ZipUtil(); ZipOutputStream zipOutputStream = zipUtil.createZipOutputStream(outputStream); ZipParameters parameters = zipUtil.createZipParameters(fileNameInZip, zipPwd); zipUtil.addNewStreamToZip(zipOutputStream, input, parameters); zipOutputStream.finish(); zipOutputStream.close();
第3行這邊可以自由定義需要的OutputStream
第5行
fileNameInZip:在zip檔中檔案的名字
(zip檔中允許相同名字的檔案,有問題的只會發生在解zip的時候一直會問你要不要覆蓋相同的檔案)
zipPwd:密碼是個別有效的
沒有留言:
張貼留言