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

Android如何实现压缩和解压缩文件

这篇文章主要介绍了Android实现压缩和解压文件的实例代码,涉及到批量压缩文件夹,解压缩一个文件等方面的知识点,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看下吧

废话不多说了,直接给大家贴java代码了,具体代码如下所示:

Java代码

package com.maidong.utils; 
import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipException; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipOutputStream; 
import org.apache.http.protocol.HTTP; 
public class ZipUtils { 
private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte 
/**
* 批量压缩文件(夹)
* 
* @param resFileList
* 要压缩的文件(夹)列表
* @param zipFile
* 生成的压缩文件
* @throws IOException
* 当压缩过程出错时抛出
*/ 
public static void zipFiles(Collection resFileList, File zipFile) throws IOException { 
ZipOutputStream zipout = null; 
try { 
zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE)); 
for (File resFile : resFileList) { 
zipFile(resFile, zipout, ""); 
} 
} finally { 
if (zipout != null) 
zipout.close(); 
} 
} 
/**
* 批量压缩文件(夹)
* 
* @param resFileList
* 要压缩的文件(夹)列表
* @param zipFile
* 生成的压缩文件
* @param comment
* 压缩文件的注释
* @throws IOException
* 当压缩过程出错时抛出
*/ 
public static void zipFiles(Collection resFileList, File zipFile, String comment) throws IOException { 
ZipOutputStream zipout = null; 
try { 
zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile), BUFF_SIZE)); 
for (File resFile : resFileList) { 
zipFile(resFile, zipout, ""); 
} 
zipout.setComment(comment); 
} finally { 
if (zipout != null) 
zipout.close(); 
} 
} 
/**
* 解压缩一个文件
* 
* @param zipFile
* 压缩文件
* @param folderPath
* 解压缩的目标目录
* @throws IOException
* 当解压缩过程出错时抛出
*/ 
public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException { 
File desDir = new File(folderPath); 
if (!desDir.exists()) { 
desDir.mkdirs(); 
} 
ZipFile zf = new ZipFile(zipFile); 
InputStream in = null; 
OutputStream out = null; 
try { 
for (Enumeration<&#63;> entries = zf.entries(); entries.hasMoreElements();) { 
ZipEntry entry = ((ZipEntry) entries.nextElement()); 
in = zf.getInputStream(entry); 
String str = folderPath + File.separator + entry.getName(); 
str = new String(str.getBytes("8859_1"), HTTP.UTF_8); 
File desFile = new File(str); 
if (!desFile.exists()) { 
File fileParentDir = desFile.getParentFile(); 
if (!fileParentDir.exists()) { 
fileParentDir.mkdirs(); 
} 
desFile.createNewFile(); 
} 
out = new FileOutputStream(desFile); 
byte buffer[] = new byte[BUFF_SIZE]; 
int realLength; 
while ((realLength = in.read(buffer)) > 0) { 
out.write(buffer, 0, realLength); 
} 
} 
} finally { 
if (in != null) 
in.close(); 
if (out != null) 
out.close(); 
} 
} 
/**
* 解压文件名包含传入文字的文件
* 
* @param zipFile
* 压缩文件
* @param folderPath
* 目标文件夹
* @param nameContains
* 传入的文件匹配名
* @throws ZipException
* 压缩格式有误时抛出
* @throws IOException
* IO错误时抛出
*/ 
public static ArrayList upZipSelectedFile(File zipFile, String folderPath, String nameContains) throws ZipException, 
IOException { 
ArrayList fileList = new ArrayList(); 
File desDir = new File(folderPath); 
if (!desDir.exists()) { 
desDir.mkdir(); 
} 
ZipFile zf = new ZipFile(zipFile); 
InputStream in = null; 
OutputStream out = null; 
try { 
for (Enumeration<&#63;> entries = zf.entries(); entries.hasMoreElements();) { 
ZipEntry entry = ((ZipEntry) entries.nextElement()); 
if (entry.getName().contains(nameContains)) { 
in = zf.getInputStream(entry); 
String str = folderPath + File.separator + entry.getName(); 
str = new String(str.getBytes("8859_1"), HTTP.UTF_8); 
// str.getBytes(AppConstans.UTF_8),"8859_1" 输出 
// str.getBytes("8859_1"),AppConstans.UTF_8 输入 
File desFile = new File(str); 
if (!desFile.exists()) { 
File fileParentDir = desFile.getParentFile(); 
if (!fileParentDir.exists()) { 
fileParentDir.mkdirs(); 
} 
desFile.createNewFile(); 
} 
out = new FileOutputStream(desFile); 
byte buffer[] = new byte[BUFF_SIZE]; 
int realLength; 
while ((realLength = in.read(buffer)) > 0) { 
out.write(buffer, 0, realLength); 
} 
fileList.add(desFile); 
} 
} 
} finally { 
if (in != null) 
in.close(); 
if (out != null) 
out.close(); 
} 
return fileList; 
} 
/**
* 获得压缩文件内文件列表
* 
* @param zipFile
* 压缩文件
* @return 压缩文件内文件名称
* @throws ZipException
* 压缩文件格式有误时抛出
* @throws IOException
* 当解压缩过程出错时抛出
*/ 
public static ArrayList getEntriesNames(File zipFile) throws ZipException, IOException { 
ArrayList entryNames = new ArrayList(); 
Enumeration<&#63;> entries = getEntriesEnumeration(zipFile); 
while (entries.hasMoreElements()) { 
ZipEntry entry = ((ZipEntry) entries.nextElement()); 
entryNames.add(new String(getEntryName(entry).getBytes(HTTP.UTF_8), "8859_1")); 
} 
return entryNames; 
} 
/**
* 获得压缩文件内压缩文件对象以取得其属性
* 
* @param zipFile
* 压缩文件
* @return 返回一个压缩文件列表
* @throws ZipException
* 压缩文件格式有误时抛出
* @throws IOException
* IO操作有误时抛出
*/ 
public static Enumeration<&#63;> getEntriesEnumeration(File zipFile) throws ZipException, IOException { 
ZipFile zf = new ZipFile(zipFile); 
return zf.entries(); 
} 
/**
* 取得压缩文件对象的注释
* 
* @param entry
* 压缩文件对象
* @return 压缩文件对象的注释
* @throws UnsupportedEncodingException
*/ 
public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException { 
return new String(entry.getComment().getBytes(HTTP.UTF_8), "8859_1"); 
} 
/**
* 取得压缩文件对象的名称
* 
* @param entry
* 压缩文件对象
* @return 压缩文件对象的名称
* @throws UnsupportedEncodingException
*/ 
public static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException { 
return new String(entry.getName().getBytes(HTTP.UTF_8), "8859_1"); 
} 
/**
* 压缩文件
* 
* @param resFile
* 需要压缩的文件(夹)
* @param zipout
* 压缩的目的文件
* @param rootpath
* 压缩的文件路径
* @throws FileNotFoundException
* 找不到文件时抛出
* @throws IOException
* 当压缩过程出错时抛出
*/ 
private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath) throws FileNotFoundException, IOException { 
rootpath = rootpath + (rootpath.trim().length() == 0 &#63; "" : File.separator) + resFile.getName(); 
rootpath = new String(rootpath.getBytes("8859_1"), HTTP.UTF_8); 
BufferedInputStream in = null; 
try { 
if (resFile.isDirectory()) { 
File[] fileList = resFile.listFiles(); 
for (File file : fileList) { 
zipFile(file, zipout, rootpath); 
} 
} else { 
byte buffer[] = new byte[BUFF_SIZE]; 
in = new BufferedInputStream(new FileInputStream(resFile), BUFF_SIZE); 
zipout.putNextEntry(new ZipEntry(rootpath)); 
int realLength; 
while ((realLength = in.read(buffer)) != -1) { 
zipout.write(buffer, 0, realLength); 
} 
in.close(); 
zipout.flush(); 
zipout.closeEntry(); 
} 
} finally { 
if (in != null) 
in.close(); 
// if (zipout != null); 
// zipout.close(); 
} 
} 
} 

代码到此结束,关于Android实现压缩和解压缩文件的全内容就给大家介绍这么多,希望能够帮助到大家!


推荐阅读
  • 这篇文章主要介绍了微信小程序怎么调用视频的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么调用 ... [详细]
  • 本文介绍了产品销售管理系统的设计与实现,该系统旨在模拟企业产品销售流程,涵盖产品、客户及发票等关键管理对象,支持销售记录的创建与查询,并提供详细的统计数据。 ... [详细]
  • 本文详细介绍了 Android 开发中显式 Intent 和隐式 Intent 的区别及应用场景,包括如何通过显式 Intent 在同一应用内切换 Activity,以及如何利用隐式 Intent 实现跨应用的功能调用。 ... [详细]
  • 微信小程序开发教程(二):利用AppId启动你的小程序
    上一节我们探讨了微信小程序的注册流程。本篇将深入介绍如何获取并使用AppId来创建微信小程序,为后续开发打下基础。 ... [详细]
  • 利用Charles工具进行移动设备网络监控
    本文介绍了如何通过配置Charles代理软件来实现对移动设备的网络请求进行监控和调试,适用于开发者或测试人员需要检查移动应用网络通信的情况。 ... [详细]
  • 撰写硕士论文首先需确定一个具有新颖性的研究主题,这不仅要求选题具备创新的观点、方法或材料,还需确保选题的可行性和深度。本文将详细介绍从选题到论文完成的六大步骤,帮助研究生高效完成高质量的学术论文。 ... [详细]
  • 在一个大型的应用系统中,往往需要多个进程相互协作,进程间通信(IPC,InterProcessCommunication)就显得比较重要了。在Linux系统中,有很多种IPC机制, ... [详细]
  • 本文探讨了在Android应用程序开发过程中动态管理Fragment的方法,包括动态添加和切换Fragment,以及如何实现平滑的过渡动画。文章通过一个具体的案例——订单管理系统,详细介绍了实现步骤和技术细节。 ... [详细]
  • 本文探讨了缓存系统中的两个关键问题——缓存穿透与缓存失效时的雪崩效应,以及这些问题的解决方案。此外,文章还介绍了数据处理、数据库拆分策略、缓存优化、拆分策略、应用架构演进及通信协议的选择等内容。 ... [详细]
  • 在使用 Android Fragment 兼容包时,可能会遇到 'The specified child already has a parent' 的异常。本文将详细解释这一错误的原因,并提供解决方案。 ... [详细]
  • 本文提供了多个版本的 Android NDK 的官方下载链接,并简要介绍了如何在项目中配置 NDK 构建。 ... [详细]
  • 本文介绍了如何通过修改Android应用的配置文件和编写布局与Activity代码,利用DOM模式将用户输入的数据保存为XML文件。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • Codeforces Round #360 - The Values You Can Make
    题目描述:给定一组数字,首先选择一些子序列,使其和等于k;然后从所有和为k的子序列中再次选择子序列,计算这些子序列的和的所有可能值,并按升序输出。 ... [详细]
  • CDH Web安装指南
    本文详细介绍了如何通过Web界面快速安装CDH(Cloudera Distribution Including Apache Hadoop),包括环境准备、步骤详解及常见问题解决方法。 ... [详细]
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社区 版权所有