java压缩----使用ANT JDK压缩---只压缩选中目录的指定文件夹
写在前面的话:使用ANT中的压缩功能在很多文章中都有,但是只能压缩指定目录的全部文件或者文件夹,在项目中,经常有这样的需求:只压缩指定目录的部分文件夹, 用过ant.xml 的人都很容易想到 fileset 的子属性: exclude 和 include , 看了一下ant的源码?, 其对应的类就是各种的selector , 所以简单尝使了两种selector 实现了上面所说的功能,具体代码如下.
?
可能大家会问, 为什么不把要压缩的文件拷贝到一个文件夹, 再压缩, 是因为我很怵文件的读写, 总感觉文件读写万一处理不好效率会有很大的影响,? 把工作交给ANT比较放心.
?
其实, ANT的设计相当优雅,有时间真得应该拜读一下源码.
?
?
第一种:只能选择指定目录的一个文件夹.public static void main(String[] args) {try {Project prj = new Project();Zip zip = new Zip();zip.setProject(prj);zip.setDestFile(new File("d:\\a.zip"));String src1 = "D:\\evidence\\20120806\";File src = new File(src1);FileSet fileSet = new FileSet();fileSet.setProject(prj);if (src.isFile()) {fileSet.setFile(src);} else {fileSet.setDir(src);}/** * <pre> * 目标:打包时只选指定目录的文件夹A和文件夹B,对于下面的程序来讲,"79个..."和"过年写的.."就是指两个文件夹. * 方法:为fileSet添加两个FilenameSelector * 实现效果:只会把第一个加入的FilenameSelector打包,第二个不会. * 总结:打包目录全部的文件夹,只需在文件名后面加"/**\/*" * </pre> */FilenameSelector a = new FilenameSelector();a.setName("79个不可不知的生活潜规则_2012080617154683/**/*");FilenameSelector b = new FilenameSelector();b.setName("过年写的几篇家乡小吃片段_2012080617154651/**/*");fileSet.addFilename(b);fileSet.addFilename(a);zip.addFileset(fileSet);zip.execute();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}?第二种:可以选择指定目录的N个子文件夹.
public static void main(String[] args) {try {Project prj = new Project();Zip zip = new Zip();zip.setProject(prj);zip.setDestFile(new File("d:\\a.zip"));String src1 = "D:\\evidence\\20120806\";File src = new File(src1);FileSet fileSet = new FileSet();fileSet.setProject(prj);if (src.isFile()) {fileSet.setFile(src);} else {fileSet.setDir(src);}/** * <pre> * 目标:打包时只选指定目录的文件夹A和文件夹B,对于下面的程序来讲,"79个..."和"过年写的.."就是指两个文件夹. * 方法:为fileSet添加OrSelector,在OrSelector中添加两个FilenameSelector * 实现效果:实现目标 * </pre> */FilenameSelector a = new FilenameSelector();a.setName("79个不可不知的生活潜规则_2012080617154683/**/*");FilenameSelector b = new FilenameSelector();b.setName("过年写的几篇家乡小吃片段_2012080617154651/**/*");OrSelector or = new OrSelector(); or.addFilename(a); or.addFilename(b);fileSet.addOr(or);zip.addFileset(fileSet);zip.execute();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
?