`

调用org.apache.tools.zip实现Zip压缩 (by quqi99)

 
阅读更多

package jcss.search.base;

/*
调用org.apache.tools.zip实现压缩。
夜可以使用java.util.zip不过如果是中文的话,
解压缩的时候文件名字会是乱码。原因是解压缩软件的编码格式跟
java.util.zip.ZipInputStream的编码字符集不同
java.util.zip.ZipInputStream的字符集固定是UTF-8

注销的部分是解压缩的代码。
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.tools.zip.ZipOutputStream;

/*
* @作者:张华 @日期:2006-5-14 @说明:
*/
public class ZipUtil {

public void zip(String zipFileName, String inputFile) throws Exception {
zip(zipFileName, new File(inputFile));
}

public void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
new String(zipFileName.getBytes("gb2312"))));
System.out.println("zip start");
zip(out, inputFile, "");
System.out.println("zip done");
out.close();
}

public void zip(ZipOutputStream out, File f, String base) throws Exception {
System.out.println("Zipping " + f.getName());
if (f.isDirectory()) {
File[] fl = f.listFiles();
//out.putNextEntry(new ZipEntry(base + "/"));
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName());
System.out.println(fl[i].getName());
//System.out.println(new String(fl[i].getName().getBytes("gb2312")));
}
} else {
//out.putNextEntry(new ZipEntry(base));
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
System.out.println(base);
FileInputStream in = new FileInputStream(f);
int b;

while ((b = in.read()) != -1)
out.write(b);
in.close();
}

}

private void createDirectory(String directory, String subDirectory) {
String dir[];
File fl = new File(directory);
try {
if (subDirectory == "" && fl.exists() != true)
fl.mkdir();
else if (subDirectory != "") {
dir = subDirectory.replace('//', '/').split("/");
for (int i = 0; i < dir.length; i++) {
File subFile = new File(directory + File.separator + dir[i]);
if (subFile.exists() == false)
subFile.mkdir();
directory += File.separator + dir[i];
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}

public void unZip(String zipFileName, String outputDirectory)
throws Exception {
try {
org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName);
java.util.Enumeration e = zipFile.getEntries();
org.apache.tools.zip.ZipEntry zipEntry = null;
createDirectory(outputDirectory, "");
while (e.hasMoreElements()) {
zipEntry = (org.apache.tools.zip.ZipEntry) e.nextElement();
System.out.println("正在解压: " + zipEntry.getName());
String name= null;
if (zipEntry.isDirectory()) {
name = zipEntry.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
System.out.println("创建目录:" + outputDirectory + File.separator + name);
} else {
String fileName = zipEntry.getName();
fileName = fileName.replace('//', '/');
// System.out.println("测试文件1:" +fileName);
if (fileName.indexOf("/") != -1) {
createDirectory(outputDirectory, fileName.substring(0,fileName.lastIndexOf("/")));
fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
}

File f = new File(outputDirectory + File.separator + zipEntry.getName());

f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);

byte[] by = new byte[1024];
int c;
while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
out.close();
in.close();
}

}

//删除文件不能在这里删,因为文件正在使用,应在上传那处删
//解压后,删除压缩文件
//File zipFileToDel = new File(zipFileName);
//zipFileToDel.delete();
//System.out.println("正在删除文件:"+ zipFileToDel.getCanonicalPath());

////删除解压后的那一层目录
//delALayerDir(zipFileName, outputDirectory);

} catch (Exception ex) {
System.out.println(ex.getMessage());
}

}

/**
* 删掉一层目录
* @param zipFileName
* @param outputDirectory
*/
public void delALayerDir(String zipFileName, String outputDirectory) {

String[] dir = zipFileName.replace('//', '/').split("/");
String fileFullName = dir[dir.length - 1]; //得到aa.zip
int pos = -1;
pos = fileFullName.indexOf(".");
String fileName = fileFullName.substring(0, pos); //得到aa
String sourceDir = outputDirectory + File.separator + fileName;
try {
copyFile(new File(outputDirectory), new File(sourceDir), new File(sourceDir));

deleteSourceBaseDir(new File(sourceDir));

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 将sourceDir目录的文件全部copy到destDir中去
*/
public void copyFile(File destDir, File sourceBaseDir, File sourceDir)
throws Exception {

File[] lists = sourceDir.listFiles();
String line = null;
String url = null;
if(lists == null)
return;
for (int i = 0; i < lists.length; i++) {
File f = lists[i];
if (f.isFile()) {
FileInputStream fis = new FileInputStream(f);
String content = "";

String sourceBasePath = sourceBaseDir.getCanonicalPath();
String destPath = destDir.getCanonicalPath();
String fPath = f.getCanonicalPath();
String drPath = destDir
+ fPath.substring(fPath.indexOf(sourceBasePath)
+ sourceBasePath.length());
FileOutputStream fos = new FileOutputStream(drPath);

byte[] b = new byte[2048];
while (fis.read(b) != -1) {
if (content != null)
content += new String(b);
else
content = new String(b);
b = new byte[2048];
}

content = content.trim();
fis.close();

fos.write(content.getBytes());
fos.flush();
fos.close();

} else {
//先新建目录
new File(destDir + File.separator + f.getName()).mkdir();

copyFile(destDir, sourceBaseDir, f); //递归调用
}
}
}

/**
* 将sourceDir目录的文件全部copy到destDir中去
*/
public void deleteSourceBaseDir(File curFile) throws Exception {

File[] lists = curFile.listFiles();
String line = null;
String url = null;
File parentFile = null;
for (int i = 0; i < lists.length; i++) {
File f = lists[i];
if (f.isFile()) {
f.delete();
//若它的父目录没有文件了,说明已经删完,应该删除父目录
parentFile = f.getParentFile();
if (parentFile.list().length == 0)
parentFile.delete();
} else {
deleteSourceBaseDir(f); //递归调用
}
}
}

public static void main(String[] args) {
try {
ZipUtil t = new ZipUtil();
//t.zip("e://test.zip", "e://test");
t.unZip("e://test.zip", "e://");

} catch (Exception e) {
e.printStackTrace(System.out);
}
}

}

分享到:
评论

相关推荐

    quqi.rar_mtk_mtk software_mtk平台

    MTK平台的多功能下載軟件,適用所有MTK手機....

    视频播放源代码directshow开发

    用directshwo开发的视屏播放器,比较简单,有时候会出错

    dm8_setup_win64_ent_8.1.1.45_20191121.iso

    国内最好的数据库达梦DM8,曲奇网盘下载链接:https://quqi.com/s/1243222/wcOZdaWgUlHrwhOk

    基于Java的消息中间件java操作demo.zip

    消息中间件java操作demo 提供activeMq的 java实现,和两种模式:点对点、发布和订阅 直接clone下来,导入maven项目启动test包下的 Client.java

    基于 Python 的波士顿房价数据集

    波士顿房价数据集 波士顿房价数据集 目的:通过分析十三个房屋特征与房价的关系,同时建立模型进行房价预测 波士顿房价指标与房价的关系 CRIM:城镇人均犯罪率——负相关占比 ZN:住宅用地所占比例——无单个特征 INDUS:城镇中非住宅用地所占比例——负相关 CHAS:虚拟变量,用于回归分析——无单个特征 NOX:环保指数——无单个特征 RM:每栋住宅的房间数——正相关 AGE:1940年以前建成的自住单位的比例——无单个特征 DIS:距离5个波士顿的就业中心的加权距离——无单个特征 RAD:距离高速公路的便利指数——无单个特征 TAX:每一万美元的不动产税率——无单个特征 PTRATIO:城镇中教师学生比例——无单个特征 B:城镇中黑人的比例——无单个特征 LSTAT:地区中多少房东属于低收入人群——负相关 MEDV:自主房屋房价中位数(标签数据)——房价中位数

    优秀毕业设计 基于STM32单片机的家庭智能安全系统源码+详细文档+全部数据资料.zip

    【资源说明】 优秀毕业设计 基于STM32单片机的家庭智能安全系统源码+详细文档+全部数据资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于python U2Net 深度学习的证件照生成.zip

    基于python U2Net 深度学习的证件照生成.zip

    python爬虫教程系列、从0到1学习python爬虫,包括浏览器抓包,手机APP抓包

    python爬虫教程系列、从0到1学习python爬虫,包括浏览器抓包,手机APP抓包,如 fiddler、mitmproxy,各种爬虫涉及的模块的使用,如:requests、beautifulSoup、selenium、appium、scrapy等,以及IP代理,验证码识别,Mysql,MongoDB数据库的python使用,多线程多进程爬虫的使用,css 爬虫加密逆向破解,JS爬虫逆向,分布式爬虫,爬虫项目实战实例等

    node-v6.14.3-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.2.1-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    streamlit hello.py

    streamlit hello.py

    +++罗兰贝格PPT模板-436页(绝对经典!)

    +++罗兰贝格PPT模板-436页(绝对经典!)

    固定资产管理系统.zip

    固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进、接触、销毁,对物品的使用状态、借出状态、库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询等。本系统结构如下: (1)系统登录: 用户登录模块:登录功能 重置 (2)系统用户管理: 对系统用户的增加 系统用户的权限修改 系统用户的删除 分配系统用户的权限 修改本身登录密码 资产的相关维护 (3)员工信息管理: 教工的增加、修改、删除、查询 (4)资产入库管理: 资产的录入 资产的属性修改 资产的报废删除 资产的属性查询 (5)资产维护管理: 物资的维修、维护物资的信息修改 (7)资产借还管理: 增加借出资产 查询借出资产 归还已借出资产 (8)打印报表

    GB 4762-1984 政治面貌代码.pdf

    GB 4762-1984 政治面貌代码.pdf

    全域系统链性态网体系化作战矩阵.txt

    全域系统链性态网体系化作战矩阵.txt

    高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    基于深度学习的普通话语音识别.zip

    基于深度学习的普通话语音识别.zip

    Unity开发实践:2D平台跳跃游戏实践心得与案例解析

    案例说明:开发一个简单的2D平台跳跃游戏,游戏中,玩家控制一个角色跳过障碍物,收集金币,以达到终点。 Unity是一个功能全面、灵活性高的游戏开发平台,适合各种规模的项目开发。通过本报告的分享,希望能帮助初学者快速掌握Unity开发的核心内容,并在实际开发中运用这些知识和技能。本报告旨在通过详细的案例分析和代码示例,为Unity开发者提供实用的指导和参考,助力开发者构建更加丰富和专业的游戏作品。

    node-v7.5.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics