2017年4月25日 星期二

zip4j 自定義OutputStream

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:密碼是個別有效的

沒有留言:

張貼留言