热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Androidzip4j压缩、解压、加解密的示例代码

jdk有原生的zip包,因为用起来没有达到想要的效果,所以此次用的是第三方zip4j开源 zip4j.jar官网下载链接 直接代码:

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 arrayList = new ArrayList();
        // 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;
  }

}

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


推荐阅读
  • 作为一名饼干爱好者,我尝试过各种各样的饼干。虽然威化饼和消化饼都有其独特的风味,但我对柠檬夹心饼干情有独钟。这种饼干不仅口感丰富,还带有清新的柠檬香味。 ... [详细]
  • 在 PHP 中,使用 `continue` 关键字结合数字可以有效地终止嵌套的 `foreach` 循环。本文将详细介绍如何使用 `continue` 加数字来控制不同层次的循环。 ... [详细]
  • 本文讲述了一位80后的普通男性程序员,尽管没有高学历,但通过不断的努力和学习,在IT行业中逐渐找到了自己的位置。从最初的仓库管理员到现在的多技能开发者,他的职业生涯充满了挑战与机遇。 ... [详细]
  • 本文详细介绍了 Android 开发中常用的单位 dip(设备独立像素)、px(像素)、pt(点)和 sp(可缩放像素),并解释了它们在不同屏幕密度下的应用。 ... [详细]
  • 本文介绍了多种常用的开发工具,包括PyCharm、Appium、Jenkins、Postman、Fiddler、Charles、Airtest、Android Studio、Navicat和Typora,并提供了它们的基本使用方法。 ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 近年来,区块链技术备受关注,其中比特币(Bitcoin)功不可没。尽管数字货币的概念早在上个世纪就被提出,但直到比特币的诞生,这一概念才真正落地生根。本文将详细探讨比特币、以太坊和超级账本(Hyperledger)的核心技术和应用场景。 ... [详细]
  • 本文介绍了 LaiFengcode 在 GitHub 上的两个主要开源项目:SopCastComponent 和 iOS 相关组件。 ... [详细]
  • 使用外部样式表实现盒子居中对齐
    本文介绍如何在HTML文件中引入外部CSS样式表,并通过CSS实现盒子的居中对齐。 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • 本文介绍了如何使用线段树实现区间加法和区间查询操作,包括详细的代码实现和解释。 ... [详细]
  • 解决Eclipse中缺少Android SDK和AVD管理器的问题
    本文介绍了如何在Eclipse的Window菜单中添加Android SDK和AVD管理器选项,通过自定义透视图中的命令组可用性设置来实现。 ... [详细]
  • http:blog.csdn.netzeo112140articledetails7675195使用TCPdump工具,抓TCP数据包。将数据包上传到PC,通过Wireshark查 ... [详细]
  • 如何使用strip()方法去除字符串首尾的空白字符
    本文介绍如何使用Python中的strip()方法来去除字符串首尾的空白字符,包括空格、制表符和换行符。 ... [详细]
  • 线段树,注 ... [详细]
author-avatar
蓝社
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有