写在前面的话:使用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 block e.printStackTrace(); } }
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 block e.printStackTrace(); } }