Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典
感觉讲的非常好就转载在这保存!
java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包。
使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩。
每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对于文件,路劲以文件名称结尾。
zipoutputstream的putnextentry方法往zip文件里加入zipentry,紧接着写入到该文件zipoutputstream流中的数据都被保存到zipentry中,知道调用zipoutputstream的closeentry方法。
zipfile表示一个zip文件,它的entries方法能获得zip文件里的zipentry集合。的奥zipentry的输入流。
实例:
package book.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
* 用ZIP压缩和解压缩文件或文件夹
*/
public class CompressUtil {
/**
* 压缩文件或者文件夹
* @param baseDirName 压缩的根文件夹
* @param fileName 根文件夹下待压缩的文件或文件夹名,
* 星号*表示压缩根文件夹下的所有文件。
* @param targetFileName 目标ZIP文件
*/
public static void zipFile(String baseDirName, String fileName,
String targetFileName){
//检測根文件夹是否存在
if (baseDirName == null){
System.out.println("压缩失败,根文件夹不存在:" + baseDirName);
return;
}
File baseDir = new File(baseDirName);
if (!baseDir.exists() || (!baseDir.isDirectory())){
System.out.println("压缩失败,根文件夹不存在:" + baseDirName);
return;
}
String baseDirPath = baseDir.getAbsolutePath();
//目标文件
File targetFile = new File(targetFileName);
try{
//创建一个zip输出流来压缩数据并写入到zip文件
ZipOutputStream out =new ZipOutputStream(
new FileOutputStream(targetFile));
if (fileName.equals("*")){
//将baseDir文件夹下的所有文件压缩到ZIP
CompressUtil.dirToZip(baseDirPath, baseDir, out);
} else {
File file = new File(baseDir, fileName);
if (file.isFile()){
CompressUtil.fileToZip(baseDirPath, file, out);
} else {
CompressUtil.dirToZip(baseDirPath, file, out);
}
}
out.close();
System.out.println("压缩文件成功,目标文件名称:" + targetFileName);
} catch (IOException e){
System.out.println("压缩失败:" + e);
e.printStackTrace();
}
}
/**
* 解压缩ZIP文件,将ZIP文件中的内容解压到targetDIR文件夹下
* @param zipName 待解压缩的ZIP文件名称
* @param targetBaseDirName 目标文件夹
*/
public static void upzipFile(String zipFileName, String targetBaseDirName){
if (!targetBaseDirName.endsWith(File.separator)){
targetBaseDirName += File.separator;
}
try {
//依据ZIP文件创建ZipFile对象
ZipFile zipFile = new ZipFile(zipFileName);
ZipEntry entry = null;
String entryName = null;
String targetFileName = null;
byte[] buffer = new byte[4096];
int bytes_read;
//获取ZIP文件中全部的entry
Enumeration entrys = zipFile.entries();
//遍历全部entry
while (entrys.hasMoreElements()) {
entry = (ZipEntry)entrys.nextElement();
//获得entry的名字
entryName = entry.getName();
targetFileName = targetBaseDirName + entryName;
if (entry.isDirectory()){
// 假设entry是一个文件夹,则创建文件夹
new File(targetFileName).mkdirs();
continue;
} else {
// 假设entry是一个文件,则创建父文件夹
new File(targetFileName).getParentFile().mkdirs();
}
//否则创建文件
File targetFile = new File(targetFileName);
System.out.println("创建文件:" + targetFile.getAbsolutePath());
//打开文件输出流
FileOutputStream os = new FileOutputStream(targetFile);
//从ZipFile对象中打开entry的输入流
InputStream is = zipFile.getInputStream(entry);
while ((bytes_read = is.read(buffer)) != -1){
os.write(buffer, 0, bytes_read);
}
//关闭流
os.close( );
is.close( );
}
System.out.println("解压缩文件成功!");
} catch (IOException err) {
System.err.println("解压缩文件失败: " + err);
}
}
/**
* 将文件夹压缩到ZIP输出流。
*/
private static void dirToZip(String baseDirPath, File dir,
ZipOutputStream out){
if (dir.isDirectory()){
//列出dir文件夹下全部文件
File[] files = dir.listFiles();
// 假设是空文件夹
if (files.length == 0){
ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));
// 存储文件夹信息
try {
out.putNextEntry(entry);
out.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
for (int i=0; i<files.length; i++){
if (files[i].isFile()){
//假设是文件,调用fileToZip方法
CompressUtil.fileToZip(baseDirPath, files[i], out);
} else {
//假设是文件夹,递归调用
CompressUtil.dirToZip(baseDirPath, files[i], out);
}
}
}
}
/**
* 将文件压缩到ZIP输出流
*/
private static void fileToZip(String baseDirPath, File file,
ZipOutputStream out){
FileInputStream in = null;
ZipEntry entry = null;
// 创建复制缓冲区
byte[] buffer = new byte[4096];
int bytes_read;
if (file.isFile()){
try {
// 创建一个文件输入流
in = new FileInputStream(file);
// 做一个ZipEntry
entry = new ZipEntry(getEntryName(baseDirPath, file));
// 存储项信息到压缩文件
out.putNextEntry(entry);
// 复制字节到压缩文件
while((bytes_read = in.read(buffer)) != -1){
out.write(buffer, 0, bytes_read);
}
out.closeEntry();
in.close();
System.out.println("加入文件"
+ file.getAbsolutePath() + "被到ZIP文件里!");
} catch (IOException e){
e.printStackTrace();
}
}
}
/**
* 获取待压缩文件在ZIP文件里entry的名字。即相对于跟文件夹的相对路径名
* @param baseDirPath
* @param file
* @return
*/
private static String getEntryName(String baseDirPath, File file){
if (!baseDirPath.endsWith(File.separator)){
baseDirPath += File.separator;
}
String filePath = file.getAbsolutePath();
// 对于文件夹,必须在entry名字后面加上"/",表示它将以文件夹项存储。
if (file.isDirectory()){
filePath += "/";
}
int index = filePath.indexOf(baseDirPath);
return filePath.substring(index + baseDirPath.length());
}
public static void main(String[] args) {
//压缩C盘下的temp文件夹,压缩后的文件是C:/temp.zip
String baseDirName = "C:/";
String fileName = "temp/";
String zipFileName = "C:/temp.zip";
CompressUtil.zipFile(baseDirName, fileName, zipFileName);
//将刚创建的ZIP文件解压缩到D盘的temp文件夹下
System.out.println();
fileName = "D:/temp";
CompressUtil.upzipFile(zipFileName, fileName);
}
}
Java用ZIP格式压缩和解压缩文件的更多相关文章
- Java对zip格式压缩和解压缩
Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
reference : http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...
- Java 的zip压缩和解压缩
Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...
- 使用commons-compress操作zip文件(压缩和解压缩)
http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...
- Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)
1.压缩和解压缩命令 常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令 zip 压缩文件名 源文件:压缩文件 ...
- IO操作之使用zip包压缩和解压缩文件
转自:http://www.cdtarena.com/java.htmlJava API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...
- 【转】Java压缩和解压文件工具类ZipUtil
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- java采用zip方式实现String的压缩和解压缩CompressStringUtil类
CompressStringUtil类:不多说,直接贴代码: /** * 压缩 * * @param paramString * @return */ public static final byte ...
随机推荐
- Android:创建耐磨应用 - 语音操作
加入语音处理能力(Adding Voice Capabilities) 语音操作为用户体验可穿戴的重要组成部分,它允许用户快速.免提方式来运行操作. Wear它提供了两种类型的语音操作的: 该系统提供 ...
- C++学习笔记1--基础知识
#include <iomanip> setpresition(int n); 设置输出精度浮点数是n. [goto声明] goto也被称为无条件分支语句购买勇于改变运行顺序的声明.got ...
- 《TCP/IP作品详细解释2:达到》注意事项--IP地址
1.接口和地址 如下面的图全部本文中讨论的接口和地址的结构看一个示例配置: 上图中显示了我们三个接口样例:以太网接口,SLIP接口和环回接口. 它们都有一个链路层地址作为地址列表中的第一个结点. 显示 ...
- android user如何打开一个版本号root才干
首先,你要确认你要打开adbd 的root 才干,或者让app 它有可能获得root 才干. (1). adbd 的root 才干 我们通常debug user 当问题的版本号, 或行为user ...
- NIVC->IPR[IPADDR]
#include <stm32f10x.h> #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...
- 移动端 rem字体的使用demo
<!doctype html> <html> <head> <meta charset="utf-8"> <title ...
- Kafka项目实践
用户日志上报实时统计之编码实践 1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块. ...
- 设计管理员表;webservice用于网络安全的高端内提供服务的
admin表设计.你应该有角色表,管理员属于一个样的作用,另一个接口选项,以查看表.角色有更多的选择的能力. 角色和选项代表了许多关系,因此,我们必须保持这种关系有一个表 版权声明:本文博客原创文章, ...
- HDU3549 Flow Problem 【最大流量】
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- paip.自适应网页设计 同 响应 与设计的原理的差and实践总结
paip.自适应网页设计 同 响应 与设计的原理的差and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...