浏览 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(); } } 目前就我测试的结果看,第三种方式是最快的,不知道各位博友有没有更快的方式,欢迎大家一起过来探讨。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-09
这个问题我也没解决,期待解决
|
|
返回顶楼 | |
发表时间:2010-12-09
但是如果目录里有中文名字 就会出乱码
|
|
返回顶楼 | |
发表时间:2010-12-09
乱码问题可以单独解决的。
|
|
返回顶楼 | |
发表时间:2010-12-09
可以尝试一下用 java.nio.MappedByteBuffer
|
|
返回顶楼 | |
发表时间:2010-12-09
和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快
|
|
返回顶楼 | |
发表时间:2010-12-09
zyk1860 写道 和压缩解压没什么关系 IO的效率问题 用FileChannel可能更快
可惜Zip流不能用FileChannel包装,而如果仅在一端使用的话,获得的文件全部都是损坏了的,估计是因为乱码了 |
|
返回顶楼 | |
发表时间:2010-12-09
调用 7z的命令也很方便
|
|
返回顶楼 | |