关于安卓文件夹压缩和解压(一)zip处理

背景

把文件压里头
把文件夹压里头

相关参考

我之前的一个文章,文件递归复制思路link

思路

如果把单单一个文件压缩,那么恭喜你,不用看这个文章了,因为百度一搜就有不错的答案。
本文主要介绍,如果把整个文件夹压缩成一个文件,如何把一个压缩文件,解压出来

开发

因为是安卓原生api,这里就不作环境介绍了。

文末有全部代码!!!

文件夹压缩

首先,外部调用这个方法,就是传入一个需要压缩的文件夹的路径即可。例如/ddd/ddd/
这种,那么,代码就会进行一个判断:
(1)如果是目录,则创建目录
(2)如果是文件,那就搞里头
涉及的操作对象:ZipEntry,ZipOutputStream
注意的点:
(1)源头目录的层级,和压缩文件目录的层级,是不一样的!!!
(2)如果是目录,同样的,也需要在压缩文件中创建,保持源头的目录层级,和压缩文件的目录层级一致!!!
关键api:

zipOutputSteam.putNextEntry(zipEntry);

这个entry,就是你放入压缩文件中的操作对象,可以是文件,也可以是目录!!
核心代码如下:

        try {File file = new File(folderString + fileString);if (file.isFile()) {ZipEntry zipEntry = new ZipEntry(fileString);inputStream = new FileInputStream(file);zipOutputSteam.putNextEntry(zipEntry);int len;byte[] buffer = new byte[4096];while ((len = inputStream.read(buffer)) != -1) {zipOutputSteam.write(buffer, 0, len);}zipOutputSteam.closeEntry();} else {//文件夹//无论有没有子文件,都进行文件夹的创建ZipEntry zipEntry = new ZipEntry(fileString + File.separator);zipOutputSteam.putNextEntry(zipEntry);zipOutputSteam.closeEntry();String[] childFileList = file.list();//没有子文件和压缩//子文件和递归if (childFileList != null) {for (int i = 0; i < childFileList.length; i++) {File cacheFile = new File(childFileList[i]);String folderResult = folderString;ZipFiles(folderResult, fileString + File.separator + cacheFile.getName(), zipOutputSteam);}}}}

其实递归的逻辑,和文件夹递归复制,是一样的,区别就是,压缩文件将会多一个ZipEntry操作的流程。

解压

对于解压,这里同样,也是判断是目录,还是文件,
若是目录,则创建,若是文件,则通过ZipFile.getInputStream后,进行文件流本地生成。
核心代码如下:

    private static void unZipChild(ZipFile zipFile, ZipEntry zipEntry, String targetFolder) {try {if (zipEntry.isDirectory()) {String targetDir = targetFolder + zipEntry.getName();new File(targetDir).mkdirs();} else {InputStream inputStream = zipFile.getInputStream(zipEntry);FileOutputStream outputStream = new FileOutputStream(new File(targetFolder, zipEntry.getName()));byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, length);}outputStream.close();inputStream.close();}} catch (Exception e) {e.printStackTrace();}}

上面是文件夹压缩和解压的全部思路,下面放出所有的相关代码

public class ZipUtils {/*** 压缩文件** @param folderString* @param fileString* @param zipOutputSteam* @throws Exception*/private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) throws Exception {if (zipOutputSteam == null)return;FileInputStream inputStream = null;try {File file = new File(folderString + fileString);if (file.isFile()) {ZipEntry zipEntry = new ZipEntry(fileString);inputStream = new FileInputStream(file);zipOutputSteam.putNextEntry(zipEntry);int len;byte[] buffer = new byte[4096];while ((len = inputStream.read(buffer)) != -1) {zipOutputSteam.write(buffer, 0, len);}zipOutputSteam.closeEntry();} else {//文件夹//无论有没有子文件,都进行文件夹的创建ZipEntry zipEntry = new ZipEntry(fileString + File.separator);zipOutputSteam.putNextEntry(zipEntry);zipOutputSteam.closeEntry();String[] childFileList = file.list();//没有子文件和压缩//子文件和递归if (childFileList != null) {for (int i = 0; i < childFileList.length; i++) {File cacheFile = new File(childFileList[i]);String folderResult = folderString;ZipFiles(folderResult, fileString + File.separator + cacheFile.getName(), zipOutputSteam);}}}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException ex) {ex.printStackTrace();}}}}// 递归删除目录及其子目录和文件public static boolean deleteDirectory(File dir) {if (dir.isDirectory()) {String[] children = dir.list();for (String child : children) {boolean success = deleteDirectory(new File(dir, child));if (!success) {return false;}}}return dir.delete();}private static void unZipChild(ZipFile zipFile, ZipEntry zipEntry, String targetFolder) {try {if (zipEntry.isDirectory()) {String targetDir = targetFolder + zipEntry.getName();new File(targetDir).mkdirs();} else {InputStream inputStream = zipFile.getInputStream(zipEntry);FileOutputStream outputStream = new FileOutputStream(new File(targetFolder, zipEntry.getName()));byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, length);}outputStream.close();inputStream.close();}} catch (Exception e) {e.printStackTrace();}}//解压------------------------------------------------------------------------------------/*** @param zipFileName  压缩文件路径* @param targetFolder 解压出来的路径*/public static void unZip(String zipFileName, String targetFolder) {try {deleteDirectory(new File(targetFolder));File targetFile = new File(targetFolder);if (!targetFile.exists()) {targetFile.mkdirs();}ZipFile zipFile = new ZipFile(zipFileName);Enumeration<? extends ZipEntry> entries = zipFile.entries();while (entries.hasMoreElements()) {ZipEntry zipEntry = entries.nextElement();// 在这里可以对每个条目进行操作unZipChild(zipFile, zipEntry, targetFolder);}zipFile.close();} catch (IOException e) {e.printStackTrace();}}//压缩------------------------------------------------------------------------------------/*** 压缩文件和文件夹** @param srcFileString 要压缩的文件或文件夹* @param zipFileString 压缩完成的Zip路径* @throws Exception*/public static void ZipFolder(String srcFileString, String zipFileString, String zipName) {//创建ZIPZipOutputStream outZip = null;try {//创建文件File file = new File(srcFileString);File outPath = new File(zipFileString);if (!outPath.exists()) {outPath.mkdirs();}outZip = new ZipOutputStream(new FileOutputStream(new File(outPath, zipName)));//压缩ZipFiles(file.getParent() + File.separator, file.getName(), outZip);} catch (Exception e) {e.printStackTrace();} finally {//完成和关闭if (outZip != null) {try {outZip.flush();outZip.finish();outZip.close();} catch (IOException e) {e.printStackTrace();}}}}}

that’s all------------------------------------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

描述CSS选择器及其优先级规则

一․描述一下CSS选择器及其优先级规则 CSS选择器是用于指定CSS样式应应用于哪些HTML元素的模式。通过选择器&#xff0c;我们可以定位到特定的元素或元素组&#xff0c;并为它们应用样式。CSS选择器有多种类型&#xff0c;每种类型都有其特定的用途和语法。 以下是几种常见的…

Python数据分析与可视化笔记一 机器学习概述

机器学习是一种从数据当中发现复杂规律&#xff0c;并且利用规律对未来时刻、未知状况进行预测和判定的方法&#xff0c;是当下被认为最有可能实现人工智能的方法之一。 所有数据的集合称为数据集(dataset)&#xff0c;其中每条记录是关于一个事件或对象的描述&#xff0c;称为…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

LM2903BIDR比较器芯片中文资料规格书PDF数据手册参数引脚图功能封装尺寸图

产品概述&#xff1a; M393B 和 LM2903B 器件是业界通用 LM393 和 LM2903 比较器系列的下一代版本。下一代 B 版本比较器具有更低的失调电压、更高的电源电压能力、更低的电源电流、更低的输入偏置电流和更低的传播延迟&#xff0c;并通过专用 ESD 钳位提高了 2kV ESD 性能和输…

【CenterFusion】模型的创建、导入、保存CenterFusion/src/lib/model/model.py

文件内容&#xff1a;CenterFusion/src/lib/model/model.py 文件作用&#xff1a;模型的创建、导入、保存 model.py 具体内容如下&#xff1a; from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport torchv…

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

将VSCode添加至右键的菜单栏

懒得bb&#xff0c;直接转发别人的博客&#xff0c;链接 但是我在win11上面弄了之后&#xff0c;除了文件夹其他格式都生效了&#xff0c;只需要在这个路径HKEY_CLASSES_ROOT\Directory\shell重复上面的操作&#xff0c;看Directory就知道是文件夹

担忧关于ChatGPT潜在风险的声音正在增强,但暂停人工智能是否明智?

深度学习算法的风险与挑战&#xff1a;ChatGPT的潜在风险引发关注 引言 随着人工智能技术的快速发展&#xff0c;特别是像ChatGPT这样的大型语言模型的广泛应用&#xff0c;人们对其潜在风险的关注也在不断升温。本文将探讨这些风险&#xff0c;并分析是否应该暂停AI的发展。…

事务、并发、锁机制的实现

配置全局事务 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mydb,USER:root,PASSWORD:pass,HOST:127.0.0.1,PORT:3306,ATOMIC_REQUESTS: True, # 全局开启事务&#xff0c;绑定的是http请求响应整个过程# (non_atomic_requests可局部实现不让事务控制)} } …

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

UnityShader(十六)凹凸映射

前言&#xff1a; 纹理的一种常见应用就是凹凸映射&#xff08;bump mapping&#xff09;。凹凸映射目的就是用一张纹理图来修改模型表面的法线&#xff0c;让模型看起来更加细节&#xff0c;这种方法不会改变模型原本的顶点位置&#xff08;也就是不会修改模型的形状&#xf…

数据结构之顺序存储-顺序表的基本操作c/c++(创建、初始化、赋值、插入、删除、查询、替换、输出)

学习参考博文&#xff1a;http://t.csdnimg.cn/Qi8DD 学习总结&#xff0c;同时更正原博主在顺序表中插入元素的错误。 数据结构顺序表——基本代码实现&#xff08;使用工具&#xff1a;VS2022&#xff09;&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdi…

uniapp canvas文字和元素居中

文字居中&#xff1a;ctx.textAlign "center"; 元素居中&#xff1a;ctx.arc(screenWidth / 2, 122, 40, 0, 2 * Math.PI); ctx.arc()的x轴为当前屏幕的宽度/2&#xff1b; let screenWidth 540; let screenHeight 960; // 头像 if (photoimg) {ctx.setFillSty…

gitlab cicd问题整理

1、docker设置数据目录&#xff1a; 原数据目录磁盘空间不足&#xff0c;需要更换目录&#xff1a; /etc/docker/daemon.json //写入/etc/docker/daemon.json {"data-root": "/data/docker" } 2、Dockerfile中ADD指令不生效 因为要ADD的文件被.docker…

指南:在各主流操作系统上安装与配置Apache Tomcat

指南&#xff1a;在各主流操作系统上安装与配置Apache Tomcat Apache Tomcat作为一款广受欢迎的开源Java Servlet容器&#xff0c;为用户提供了一个纯Java环境下的Web服务器和Servlet容器。本文将详细介绍如何在不同的操作系统上安装Apache Tomcat&#xff0c;并进行基本的配置…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

smartmontools-5.43交叉编译Smartctl

嵌入式系统的sata盘经常故障&#xff0c;需要使用smatctl工具监控和诊断sata故障。 1. 从网上下载开源smartmontools-5.43包。 2. 修改makefile进行交叉编译。 由于软件包中已经包含Makefile.am&#xff0c;Makefile.in。直接运行 automake --add-missing 生成Makefile。 3.…

自动部署SSL证书到阿里云腾讯云CDN

项目地址&#xff1a;https://github.com/yxzlwz/ssl_update 项目简介 目前&#xff0c;自动申请和管理免费SSL证书的项目有很多&#xff0c;如个人正在使用的 acme.sh。然而在申请后&#xff0c;如果我们的需求不仅限于服务器本地的使用&#xff0c;证书的部署也是一件麻烦事…

Gin 框架中实现路由的几种方式介绍

本文将为您详细讲解 Gin 框架中实现路由的几种方式&#xff0c;并给出相应的简单例子。Gin 是一个高性能的 Web 框架&#xff0c;用于构建后端服务。在 Web 应用程序中&#xff0c;路由是一种将客户端请求映射到特定处理程序的方法。以下是几种常见的路由实现方式&#xff1a; …

JavaScript | 检测文档在垂直方向已滚动的像素值用pageYOffset在webstorm上显示弃用了,是否应该继续使用?还是用其他替代?

在学习JavaScript的时候&#xff0c;深入学习时会遇到一些实际案例需要检测文档在垂直方向已滚动的像素值。 例如&#xff0c;当前页面内容很多&#xff0c;我想要滚动鼠标滑轮或者拖拽滚动条来浏览网页下面的内容。这时候一动滚动条&#xff0c;一些绝对固定的盒子却想要随着…