`
Jason__Chen
  • 浏览: 14827 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

压缩解压性能探究

    博客分类:
  • JAVA
F# 
阅读更多
压缩解压性能探究

     最近正在做一个项目,最终需要通过JAVA将一部分内容打包通过FTP上传到另外一台服务器上,当时压缩方法是这么做的:(先帖一个Test)
public class Test {
	public static void main(String[] args) {
		try {
			Date date1 = new Date();
			ZipOutputStream out = new ZipOutputStream(new FileOutputStream("test.zip"));
			File inputFile = new File("d://test");
			new Test().zip(out, inputFile, "");
			out.close();
			Date date2 = new Date();
			System.out.println("耗时:"+(date2.getTime()-date1.getTime()));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void zip(ZipOutputStream out, File f, String base) throws Exception {
		if (f.isDirectory()) {
			File[] fl = f.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + fl[i].getName());
			}
		} else {
			out.putNextEntry(new ZipEntry(base));
			FileInputStream in = new FileInputStream(f);
			int b;
			while ((b = in.read()) != -1) {
				out.write(b);
			}
			in.close();
		}
  	}
}

     使用这种压缩方式效率极其低下,为了使效率提高,我先后发现了两种方法,第一种方法是利用BufferedInputStream和BufferedOutputStream对文件流进行包装,具体代码如下:
private void zip(ZipOutputStream out, File f, String base) throws Exception {
		if (f.isDirectory()) {
			File[] fl = f.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + fl[i].getName());
			}
		} else {
			out.putNextEntry(new ZipEntry(base));
			BufferedOutputStream bou = new BufferedOutputStream(out);
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
			int b;
			while ((b = in.read()) != -1) {
				bou.write(b);
			}
			in.close();
			bou.flush();
		}
        }

     虽然第二种方式使用之后速度得到明显提升,但第三种方式较第二种还快了几倍,那就是在读写的时候增加每次读写量,具体代码如下:
private void zip(ZipOutputStream out, File f, String base) throws Exception {
		if (f.isDirectory()) {
			File[] fl = f.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + fl[i].getName());
			}
		} else {
		      out.putNextEntry(new ZipEntry(base));
		      FileInputStream in = new FileInputStream(f);
		      byte[] bs = new byte[10240];
		      int b;
		      while ((b = in.read(bs)) != -1) {
		          out.write(bs, 0, b); 
		      }
		      in.close();
		    }
		
	}

     目前就我测试的结果看,第三种方式是最快的,不知道各位博友有没有更快的方式,欢迎大家一起过来探讨。
分享到:
评论
7 楼 smilerain 2010-12-09  
调用 7z的命令也很方便
6 楼 Jason__Chen 2010-12-09  
zyk1860 写道
和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快

可惜Zip流不能用FileChannel包装,而如果仅在一端使用的话,获得的文件全部都是损坏了的,估计是因为乱码了
5 楼 zyk1860 2010-12-09  
和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快
4 楼 itian 2010-12-09  
可以尝试一下用 java.nio.MappedByteBuffer
3 楼 wuyufeixue 2010-12-09  
乱码问题可以单独解决的。
2 楼 sy22006 2010-12-09  
但是如果目录里有中文名字 就会出乱码
1 楼 li.chening 2010-12-09  
这个问题我也没解决,期待解决

相关推荐

    FLASH压缩解压工具.exe

    标题中的“FLASH压缩解压工具.exe”是一款专为处理Flash(SWF)文件设计的实用程序,它提供了压缩和解压缩的功能。Flash是一种广泛应用于网页动画、游戏开发和交互式内容设计的格式。这款工具的独特之处在于它能够...

    同步压缩小波变化程序,同步压缩小波变换,matlab

    在使用这个程序集时,研究人员可以对各种信号进行同步压缩小波变换,探究其性能和适用范围。例如,可以分析信号的频率特性,识别噪声成分,或者用于图像的无损或有损压缩。此外,该程序也适用于信号的去噪处理,通过...

    数据结构实验报告利用Huffman编码对文件进行压缩解压 (3).docx

    然而,对于最佳缓存字节数的选择并未深入探究,这是未来可以优化的一个方向。 在处理文件读写时,学生遇到了不同编程语言库的兼容性问题。在C++的fstream库中,对于中文文件名和包含空格的路径支持不够友好,而...

    ext 包,解压就用

    "ext 包,解压就用"这个标题和描述提到了一个名为"ext"的工具,版本为2.0,且特别强调了它的解压缩功能。我们可以推断这是一个专用于处理压缩文件的软件或者库,可能适用于不同的操作系统或开发环境。在IT行业中,...

    steamcommunity_302_V10.6_解压密码dogfight360.zip

    【标题】"steamcommunity_302_V10.6_解压密码dogfight360.zip" 提供的信息表明,这是一个与Steam社区相关的压缩文件,版本为V10.6,可能包含了一些更新或者资源...具体的内容则需要根据解压后的文件内容来进一步探究。

    中期报告例子综述.doc

    【中期报告例子综述】 本中期报告探讨的主题是“一种数字图像压缩编码的研究”,主要集中在离散余弦变换...后续的工作可能涉及优化量化策略,改进编码算法,或者探究其他压缩编码技术与DCT的结合,以提高整体性能。

    世界大赛第一名的程序.rar

    总的来说,"世界大赛第一名的程序.rar"是一个值得探究的压缩文件,里面包含的程序不仅体现了高水平的编程技艺,还展现了创新的游戏设计理念。对于程序员、游戏开发者以及游戏爱好者来说,研究这个程序可能会带来诸多...

    MpqTool-master_MPQTOOL_源码

    《深入理解MPQTOOL:源码解析与应用探索》 ...同时,这也是一次深入探究二进制文件格式和数据压缩技术的好机会。如果你对游戏开发、数据恢复或文件系统有浓厚兴趣,那么MPQTOOL的源码绝对值得一探究竟。

    二进制查看工具 Binary Viewer 解压使用

    9. **无密码解压**:在描述中提到“无密码解压”,这意味着 Binary Viewer 可能支持打开受密码保护的压缩文件,或者至少能查看其中的二进制内容,尽管可能无法编辑或提取文件。 使用 Binary Viewer 进行二进制文件...

    TMDSnake3D-1.0.tar-源码.rar

    【解压缩步骤】要获取 TMDSnake3D 的源码,首先需要在命令行环境中运行以下命令来解压 .bz2 文件: ```bash bzip2 -dk TMDSnake3D-1.0.tar.bz2 ``` 这会生成一个未压缩的 .tar 文件。接着,使用以下命令解压 tar ...

    新建 360压缩 ZIP 文件.zip_climb7fn_flight5i1_zip_数据结构

    但根据上下文,我们可以推测“1111”可能是测试用例的输入数据、日志文件,或者是一个临时文件名,具体用途需要实际解压文件后查看。 在学习或分析这个压缩包时,我们可以关注以下几个方面: 1. **理解树数据结构*...

    glibc-2.9绿色压缩版

    3. **优化技巧**:探究性能优化的实现方法,如循环展开、内联函数等。 4. **调试经验**:了解库函数的内部工作流程,有助于定位和解决程序问题。 总之,glibc-2.9不仅是一个强大的工具,也是提升C语言编程能力的...

    IOS应用源码——ZipArchive.rar

    4. **解压缩操作**:使用`unzipFileAtPath:toPath:error:`方法,传入ZIP文件路径和解压目标路径。 5. **错误检查**:每次操作后检查返回值或错误对象,以便捕获并处理可能出现的问题。 6. **清理**:操作完成后,...

    7z _460_原代码

    首先,7z的压缩算法基于LZMA(Lempel-Ziv-Markov chain Algorithm),这是一种高效的数据压缩算法,具有高压缩比和较快的解压速度。LZMA的核心在于寻找重复的字符串模式并用短编码替换,以减少存储空间。在7z 460源...

    毕业设计——jpeg算法优化(基于python实现).zip

    5. **性能测试**:学习如何衡量和比较不同压缩设置下的性能,包括压缩速度、解压速度和图像质量指标(如PSNR、SSIM等)。 6. **问题解决**:通过与博主的沟通,提升问题解决能力,理解在实际项目中可能遇到的问题...

    ASPack汉化版脱壳工具

    4. **性能影响**:虽然ASPack能显著减小程序大小,但压缩过程可能会导致程序运行速度变慢,因为需要额外的时间来解压代码。不过,ASPack的设计尽量减少了这种负面影响。 5. **汉化版的优势**:对于中文用户来说,...

    source软件

    解压是将压缩的文件恢复到其原始状态的过程,通常使用像WinRAR或7-Zip这样的压缩工具。解压后,你将获得一系列文件和目录,这些可能包括源代码文件、文档、库文件以及安装程序。 寻找"安装文件"是安装过程的关键...

    基于电子工程探究广播电视直播技术.pdf

    第二类是通过碟形天线接收卫星信号的直播技术,可避免中间传输环节的干扰,但需要对数字信号进行压缩和解压,增加了处理复杂度。 - **直播传输系统的特点**:直播传输系统具有鲁棒性强的特点,适应各种设备需求。...

    啄木鸟解码器1.00 一款可以解码*.wav,*.mp1,*.mp2,*.mp3,*.wma,*.ogg格式的软件

    编码器和解码器通常成对出现,用于音频的压缩和解压。这个文件可能包含了将音频数据转换为各种格式的功能,使得用户不仅可以解码,还能进行编码操作,实现音频文件的自由转换。 总的来说,啄木鸟解码器1.00凭借其...

    基于arm的嵌入式Linux系统移植探究.pdf

    ARM2410是一款常见的嵌入式处理器,拥有高性能和低功耗的特点,适合用于各种嵌入式设备。移植时需要了解其硬件特性,如CPU频率、内存大小、外设接口等,以便适配内核。 其次,指定交叉编译器是关键环节。由于嵌入式...

Global site tag (gtag.js) - Google Analytics