论坛首页 Java企业应用论坛

压缩解压性能探究

浏览 5959 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-08  
压缩解压性能探究

     最近正在做一个项目,最终需要通过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();
		    }
		
	}

     目前就我测试的结果看,第三种方式是最快的,不知道各位博友有没有更快的方式,欢迎大家一起过来探讨。
   发表时间:2010-12-09  
这个问题我也没解决,期待解决
0 请登录后投票
   发表时间:2010-12-09  
但是如果目录里有中文名字 就会出乱码
0 请登录后投票
   发表时间:2010-12-09  
乱码问题可以单独解决的。
0 请登录后投票
   发表时间:2010-12-09  
可以尝试一下用 java.nio.MappedByteBuffer
0 请登录后投票
   发表时间:2010-12-09  
和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快
0 请登录后投票
   发表时间:2010-12-09  
zyk1860 写道
和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快

可惜Zip流不能用FileChannel包装,而如果仅在一端使用的话,获得的文件全部都是损坏了的,估计是因为乱码了
0 请登录后投票
   发表时间:2010-12-09  
调用 7z的命令也很方便
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics