Android zip4j压缩、解压、加解密的示例代码

所属分类: 软件编程 / Android 阅读数: 52
收藏 0 赞 0 分享

jdk有原生的zip包,因为用起来没有达到想要的效果,所以此次用的是第三方zip4j开源

zip4j.jar官网下载链接

直接代码:

package com.dfxh.wang.compress_operate;

import android.util.Log;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.File;

/**
 * Created by WangChaowei on 2017/12/27.
 *
 * 此类是用第三方开源的zip4j操作文件(目录)的压缩、解压、加解密
 */

public class CompressOperate_zip4j {
  private ZipFile zipFile;
  private ZipParameters zipParameters;
  private int result = 0; //状态返回值

  private static final String TAG = "CompressOperate_zip4j";

  /**
   * zip4j压缩
   * @param filePath 要压缩的文件路径(可文件,可目录)
   * @param zipFilePath zip生成的文件路径
   * @param password 密码
   * @return 状态返回值
   */
  public int compressZip4j(String filePath, String zipFilePath, String password) {
    File sourceFile = new File(filePath);
    File zipFile_ = new File(zipFilePath);
    try {
      zipFile = new ZipFile(zipFile_);
      zipFile.setFileNameCharset("GBK"); //设置编码格式(支持中文)

      zipParameters = new ZipParameters();
      zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); //压缩方式
      zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别
      if (password != null && password != "") {  //是否要加密(加密会影响压缩速度)
        zipParameters.setEncryptFiles(true);
        zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式
        zipParameters.setPassword(password.toCharArray());
      }

      if (zipFile_.isDirectory()) {
        String sourceFileName = checkString(sourceFile.getName()); //文件校验
        zipFilePath = zipFilePath + "/" + sourceFileName + ".zip";
        Log.i(TAG, "保存压缩文件的路径(zipFilePath):" + zipFilePath);
        compressZip4j(filePath,zipFilePath,password);
      }
      if (sourceFile.isDirectory()) {
        // File[] files = sourceFile.listFiles();
        // ArrayList<File> arrayList = new ArrayList<File>();
        // Collections.addAll(arrayList, files);
        zipFile.addFolder(sourceFile, zipParameters);
      } else {
        zipFile.addFile(sourceFile, zipParameters);
      }
      Log.i(TAG, "compressZip4j: 压缩成功");
    } catch (ZipException e) {
      Log.e(TAG, "compressZip4j: 异常:" + e);
      result = -1;
      return result;
    }
    return result;
  }

  /**
   * 校验提取出的原文件名字是否带格式
   * @param sourceFileName 要压缩的文件名
   * @return
   */
  private String checkString(String sourceFileName){
    if (sourceFileName.indexOf(".") > 0){
      sourceFileName = sourceFileName.substring(0,sourceFileName.length() - 4);
      Log.i(TAG, "checkString: 校验过的sourceFileName是:" + sourceFileName);
    }
    return sourceFileName;
  }

  /**
   * zip4j解压
   * @param zipFilePath 待解压的zip文件(目录)路径
   * @param filePath 解压到的保存路径
   * @param password 密码
   * @return 状态返回值
   */
  public int uncompressZip4j(String zipFilePath, String filePath, String password) {
    File zipFile_ = new File(zipFilePath);
    File sourceFile = new File(filePath);

    try {
      zipFile = new ZipFile(zipFile_);
      zipFile.setFileNameCharset("GBK"); //设置编码格式(支持中文)
      if (!zipFile.isValidZipFile()){   //检查输入的zip文件是否是有效的zip文件
        throw new ZipException("压缩文件不合法,可能被损坏.");
      }
      if (sourceFile.isDirectory() && !sourceFile.exists()) {
        sourceFile.mkdir();
      }
      if (zipFile.isEncrypted()) {
        zipFile.setPassword(password.toCharArray());
      }
      zipFile.extractAll(filePath); //解压
      Log.i(TAG, "uncompressZip4j: 解压成功");

    } catch (ZipException e) {
      Log.e(TAG, "uncompressZip4j: 异常:"+ e);
      result = -1;
      return result;
    }
    return result;
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多