Android压缩文件或者文件夹(可带密码)

Android压缩文件或者文件夹(可带密码)

前言: 最近项目需要将APP中导出的数据文件夹进行压缩并加密,来保证数据的安全性。Java本身有对文件进行压缩的zip类,但是,它不能对文件进行加密。而利用zip4j开源jar包进行压缩文件可以同时对其进行加密,故本文介绍利用zip4j-1.3.3开源jar包进行文件的压缩(带密码)。

一、zip4j-1.3.3网盘下载:

https://pan.baidu.com/s/1wD0lsgXVCOo3nhAdscjnPA 提取密码:ydo8

二、将下载的jar拷贝到libs目录下,并右键选择add as library…添加到引用

三、以下代码是我简单封装的两个方法,用来进行压缩,解压;

package com.tuoqun.Tool;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;

import com.tuoqun.DataOperation.BasicDOClass;
import com.tuoqun.FieldAssistant.MainActivity;

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;

/**
 * 文件(夹)压缩、解压,加密码类
 */
public class ZIPClass {

    private static String tag="ZIPClass";

    /**
     * (有密码)压缩文件夹或者文件
     * @param fromZipPath 待压缩的文件夹或文件全路径
     * @param toZipPath 压缩到的文件路径.../*.zip
     * @param zipPasswor 压缩密码(若为null,则无密码)
     */
    public static void zipDir_File(String fromZipPath,String toZipPath,String zipPassword)
    {
        getPermission();//必须先动态获取写权限才能进行后面的操作否则会报错:java.io.FileNotFoundException ... open failed: EACCES (Permission denied)
        File fromFile=new File(fromZipPath);
        File toFile=new File(toZipPath);

        BasicDOClass.deleteFile(toZipPath);
        try{
            ZipFile zipFile=new ZipFile(toFile);
            zipFile.setFileNameCharset("GBK");//设置编码格式(支持中文)
            ZipParameters zipParameters=new ZipParameters();
            zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            if (zipPassword!=null)//是否要加密(加密会影响压缩速度)
            {
                zipParameters.setEncryptFiles(true);
                zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//加密方式
                zipParameters.setPassword(zipPassword);
            }
            if (fromFile.isDirectory())//压缩文件夹
            {
                zipFile.addFolder(fromFile,zipParameters);
            }
            else//压缩文件
            {
                zipFile.addFile(fromFile,zipParameters);
            }
        }
        catch (Exception ex)
        {
            Log.e(tag,ex.getMessage());
        }
    }

    /**
     * (有密码)解缩文件夹或者文件
     * @param fromZipPath 压缩到的文件路径.../*.zip
     * @param toZipPath 解压的文件夹路径
     * @param zipPassword 压缩密码(若为null,则无密码)
     */
    public static void unZipDir_File(String fromZipPath,String toZipPath,String zipPassword)
    {
        File fromFile=new File(fromZipPath);
        File toFile=new File(toZipPath);
        try {
            ZipFile zipFile=new ZipFile(fromFile);
            zipFile.setFileNameCharset("GBK");//设置编码格式(支持中文)
            if (!zipFile.isValidZipFile()){     //检查输入的zip文件是否是有效的zip文件
                throw new ZipException("压缩文件不合法,可能被损坏.");
            }
            if (toFile.isDirectory() && !toFile.exists()) {//创建解压至的文件夹
                toFile.mkdir();
            }
            if (zipFile.isEncrypted()) {//压缩包是否加密
                zipFile.setPassword(zipPassword);
            }
            zipFile.extractAll(toZipPath); //解压至文件夹
        } catch (ZipException e) {
            Log.e(tag,e.getMessage());
        }
    }

    /**
     * 动态获取权限,Android 6.0 新特性,一些保护权限,除了要在AndroidManifest中声明权限,还要使用如下代码动态获取
     */
    private static void getPermission()
    {
        if (Build.VERSION.SDK_INT >= 23) {
            int REQUEST_CODE_CONTACT = 101;
            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            //验证是否许可权限
            for (String str : permissions) {
                if (MainActivity.m_context.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    //申请权限
                    MainActivity.m_context.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                    return;
                }
            }
        }
    }
}

注意1: getPermission()方法用来动态使APP获得读取权限,一般我们习惯将这些权限配置在AndroidManifest文件中,但是Android 6.0 之后,一些权限不能仅仅配置再AndroidManifest文件中,还需要用代码进行动态获取;本文的文件压缩代码,如果没有动态获取读取权限,将会获得错误:错:java.io.FileNotFoundException … open failed: EACCES (Permission denied),很坑的(哭死)

注意2: getPermission()方法中的 MainActivity.m_context
定义如下public static Activity m_context;如果再Activity 中调用该方法,直接用this代替即可

四、上述方法的使用如下

ZIPClass.zipDir_File(packagePath,packagePath+".zip","tuoqun");//工程包加密压缩
delFolder(packagePath);//加密压缩后,删除源数据文件夹
    原文作者:Mekeater
    原文地址: https://blog.csdn.net/qq_34720818/article/details/96872314
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞