最近在一个项目里因涉及到大数据量的压缩,发现通用的递归压缩的效率比较慢,我在项目测试中对一个2G大小的文件进行压缩发现需要4个小时才能压缩完成,感觉效率比较慢,因此查找了一些资料,发现使用ant的zipAPI接口进行压缩可以大大提高压缩效率,并且代码更简洁,初步评估效率可提高15倍,下面是测试样例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.zip.*;
public class ZipTest {
public void antZip(String src,String dest) {
Zip zip = new Zip();
try {
zip.setBasedir(new File(src));
Project p = new Project();
zip.setDestFile(new File(dest));
p.setBaseDir(new File(src));
zip.setProject(p);
zip.execute();
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
public void commZip(String src, String dest) {
try {
FileOutputStream out = new FileOutputStream(new String(dest
.getBytes("gb2312")));
ZipOutputStream zOut = new ZipOutputStream(out);
zip(zOut, new File(src), "");
zOut.close();
} catch (FileNotFoundException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
private void zip(ZipOutputStream zOut, File file, String base)
throws Exception {
if (file.isDirectory()) {
File[] listFiles = file.listFiles();
zOut.putNextEntry(new ZipEntry(base + "/"));
base = (base.length() == 0 ? "" : base + "/");
for (int i = 0; i < listFiles.length; i++) {
zip(zOut, listFiles[i], base + listFiles[i].getName());
}
} else {
if (base == "") {
base = file.getName();
}
zOut.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(file);
int len;
while ((len = in.read()) != -1) {
zOut.write(len);
}
in.close();
}
}
public static void main(String[] args) {
ZipTest zip=new ZipTest();
//ant zip
long start = System.currentTimeMillis();
zip.antZip("F:\\workspace\\idrs_yingji\\WebRoot\\WEB-INF\\classes",
"F:\\test.zip");
long end = System.currentTimeMillis();
System.out.println("ant zip 耗时::" + (end - start) / 1000);
//common zip
long start1 = System.currentTimeMillis();
zip.commZip("F:\\workspace\\idrs_yingji\\WebRoot\\WEB-INF\\classes",
"F:\\test1.zip");
long end1 = System.currentTimeMillis();
System.out.println("common zip 耗时::" + (end1 - start1) / 1000);
}
}
测试结果
ant zip 耗时::1
common zip 耗时::15
后面将项目的压缩方式改为ANT的接口后,对一个2G的目录进行压缩只用了不到3分钟,而之前需要4.5小时
分享到:
相关推荐
C++利用Zlib库实现zip文件压缩及解压 支持递归压缩.可配合自动更新功能实现zip压缩包进得软件更新
Java中递归逻辑循环调用解压zip里面所有的压缩包 Java中递归逻辑循环调用解压zip里面所有的压缩包
主要介绍了使用java API实现zip递归压缩文件夹及解压,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
基于python实现的迷宫生成算法+基于递归的求解源码.zip基于python实现的迷宫生成算法+基于递归的求解源码.zip基于python实现的迷宫生成算法+基于递归的求解源码.zip基于python实现的迷宫生成算法+基于递归的求解源码...
后台返回菜单无限层级展示
c++递归函数基本代码.zip
关于sharpziplib的压缩,网上的文档很多,虽然有支持文件夹压缩的,但总都有这样或者那样的问题,或者不支持文件夹的递归, 这个源码是是我费半天功夫调试出来的,支持文件 文件夹的递归。
已知问题:不支持空文件的压缩 ...解决不用从根目录压缩,即如果压缩的是C:\a\b\c\d ,压缩成C:\x.zip,打开看到的是d\....而非a\b\c\d\... 本代码基于xjzdr的代码上修改,主要修改了压缩部分的代码
C#压缩、解压缩类 压缩 解压缩 递归压缩文件夹方法 压缩目录 压缩文件 压缩 解压
6--[scratch爬台阶问题求解(递归求解)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码6--[scratch爬台阶问题求解(递归求解)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码6--[scratch爬台阶...
ant递归编译测试源码,基于import macrodef subant if available dirname
全面递归省市区存库.zip
关于递归教学的探讨.zip
jquery实现递归tr子节点.zip
基础06二叉树的递归套路.flv.zip
数据结构大作业的迷宫小游戏(递归和非递归都有).zip
实验二 递归下降语法分析器设计 一、实验目的 (1)加深对递归下降分析法一种自顶向下的语法分析方法的理解。 (2)根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器。 二、实验内容 ...
C++Zip压缩解压缩示例,用第三方函数封装而成,支持 UNCODE, ANSCII、支持压缩文件夹、支持递归压缩
基于《编译原理教程(第四版)》胡元义 第三章 语法分析 伪代码(P52-53)实现的递归下降分析器。 自顶向下的语法分析 实现方式:c语言 内容包括: (1) 文法 (2) 源代码 分析的字符串为i*(i+i)# 注意:c语言...
递归解压并分类 支持 Zip Rar 7z Tar TarGZ