首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > Apache >

利用apache ant 包开展压缩、解压缩zip,归档tar,解档tar,压缩tar.gz解压tar.gz

2012-11-10 
利用apache ant 包进行压缩、解压缩zip,归档tar,解档tar,压缩tar.gz解压tar.gz最近用到了利用java进行一序

利用apache ant 包进行压缩、解压缩zip,归档tar,解档tar,压缩tar.gz解压tar.gz
最近用到了利用java进行一序列压缩解压缩,jdk也自带了,这里我就不用它了。本例用到的开源包是apahce ant.jar。我上传了。希望对大家有帮组。
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.zip.CRC32;import java.util.zip.CheckedOutputStream;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;/** * 利用Apache ant.jar中的zip包进行Zip压缩和解压 */public class XZouZip {/** * 测试压缩 */public void testZip(){File srcFile = new File("c:/upload");//要压缩的文件对象File targetZipFile = new File("c:/upload.zip");//压缩后的文件名ZipOutputStream out = null;boolean boo = false;//是否压缩成功try{CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(targetZipFile), new CRC32()); out = new ZipOutputStream(cos);//out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("c:/uploadd.zip")));zip(srcFile, out, "", true);boo = true;}catch(IOException ex){throw new RuntimeException(ex);}finally{try{if(out!=null)out.close();}catch(IOException ex){throw new RuntimeException("关闭Zip输出流出现异常",ex);}finally{//清理操作if(!boo && targetZipFile.exists())//压缩不成功,targetZipFile.delete();}}}/** * 测试解压缩 */public void testUnZip(){File srcZipFile = new File("c:/upload.zip");//要解压缩的zip文件对象String destDir = "c:/a";//将解压文件对象放置a目录中boolean boo = false;//是否压缩成功try {unZip(srcZipFile,destDir);boo = true;} catch (IOException e) {throw new RuntimeException(e);}finally{//清理操作if(!boo)deleteDirectory(new File(destDir));//目标文件夹 。清理}}public static void main(String[] args) throws IOException {XZouZip tool = new XZouZip();tool.testZip();//tool.testUnZip();}/** * 压缩zip文件 * @param file 压缩的文件对象 * @param out 输出ZIP流 * @param dir 相对父目录名称 * @param boo 是否把空目录压缩进去 */public void zip(File file,ZipOutputStream out,String dir,boolean boo) throws IOException{if(file.isDirectory()){//是目录File []listFile = file.listFiles();//得出目录下所有的文件对象if(listFile.length == 0 && boo){//空目录压缩out.putNextEntry(new ZipEntry(dir + file.getName() + "/"));//将实体放入输出ZIP流中System.out.println("压缩." + dir + file.getName() + "/");return;}else{for(File cfile: listFile){zip(cfile,out,dir + file.getName() + "/",boo);//递归压缩}}}else if(file.isFile()){//是文件System.out.println("压缩." + dir + file.getName() + "/");byte[] bt = new byte[2048*2]; ZipEntry ze = new ZipEntry(dir+file.getName());//构建压缩实体 //设置压缩前的文件大小 ze.setSize(file.length()); out.putNextEntry(ze);////将实体放入输出ZIP流中 FileInputStream fis = null; try{ fis = new FileInputStream(file); int i=0; while((i = fis.read(bt)) != -1) {//循环读出并写入输出Zip流中 out.write(bt, 0, i); } }catch(IOException ex){ throw new IOException("写入压缩文件出现异常",ex); }finally{ try{ if (fis != null) fis.close();//关闭输入流 }catch(IOException ex){ throw new IOException("关闭输入流出现异常"); } } }}/** * 解压缩zipFile * @param file 要解压的zip文件对象 * @param outputDir 要解压到某个指定的目录下 * @throws IOException */public void unZip(File file,String outputDir) throws IOException {ZipFile zipFile = null;try {zipFile = new ZipFile(file);createDirectory(outputDir,null);//创建输出目录Enumeration<?> enums = zipFile.getEntries();while(enums.hasMoreElements()){ZipEntry entry = (ZipEntry) enums.nextElement();System.out.println("解压." + entry.getName());if(entry.isDirectory()){//是目录createDirectory(outputDir,entry.getName());//创建空目录}else{//是文件File tmpFile = new File(outputDir + "/" + entry.getName());createDirectory(tmpFile.getParent() + "/",null);//创建输出目录InputStream in = null;OutputStream out = null;try{in = zipFile.getInputStream(entry);;out = new FileOutputStream(tmpFile);int length = 0;byte[] b = new byte[2048];while((length = in.read(b)) != -1){out.write(b, 0, length);}}catch(IOException ex){throw ex;}finally{if(in!=null)in.close();if(out!=null)out.close();}}}} catch (IOException e) {throw new IOException("解压缩文件出现异常",e);} finally{try{if(zipFile != null){zipFile.close();}}catch(IOException ex){throw new IOException("关闭zipFile出现异常",ex);}}}/** * 构建目录 * @param outputDir * @param subDir */public void createDirectory(String outputDir,String subDir){File file = new File(outputDir);if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空file = new File(outputDir + "/" + subDir);}if(!file.exists()){file.mkdirs();}}/** * 清理文件(目录或文件) * @param file */public void deleteDirectory(File file){if(file.isFile()){file.delete();//清理文件}else{File list[] = file.listFiles();if(list!=null){for(File f: list){deleteDirectory(f);}file.delete();//清理目录}}}}
import java.io.File;import org.apache.tools.ant.Project;import org.apache.tools.ant.taskdefs.Expand;import org.apache.tools.ant.taskdefs.Zip;import org.apache.tools.ant.types.FileSet;/** * 利用Apache ant.jar中的ant包进行Zip压缩和解压 * 这个更为简单 */public class XZouZipByAnt {public static void main(String[] args) {XZouZipByAnt jzb = new XZouZipByAnt();jzb.zip("c:/upload", "c:/upload.zip");//jzb.unZip("c:/a", "c:/upload.zip");}/** * 解压缩 * @param destDir 生成的目标目录下 c:/a * @param sourceZip 源zip文件 c:/upload.zip * 结果则是 将upload.zip文件解压缩到c:/a目录下 */public void unZip(String destDir,String sourceZip){ try {Project prj1 = new Project();Expand expand = new Expand();expand.setProject(prj1);expand.setSrc(new File(sourceZip));expand.setOverwrite(false);//是否覆盖File f = new File(destDir);expand.setDest(f);expand.execute();} catch (Exception e) {e.printStackTrace();}}/** * 压缩 * * @param sourceFile * 压缩的源文件 如: c:/upload * @param targetZip * 生成的目标文件 如:c:/upload.zip */public void zip(String sourceFile,String targetZip){ Project prj = new Project(); Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(new File(targetZip));//设置生成的目标zip文件File对象 FileSet fileSet = new FileSet(); fileSet.setProject(prj); fileSet.setDir(new File(sourceFile));//设置将要进行压缩的源文件File对象 //fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹,只压缩目录中的所有java文件 //fileSet.setExcludes("**/*.java"); //排除哪些文件或文件夹,压缩所有的文件,排除java文件 zip.addFileset(fileSet); zip.execute();}}
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;import org.apache.tools.tar.TarEntry;import org.apache.tools.tar.TarInputStream;import org.apache.tools.tar.TarOutputStream;/** * 通过 Apache Tool 进行JAVA tar || tar.gz */public class XZouTarAndGz {/** * 测试归档tar文件 */public File testTar(){File srcFile = new File("c:/upload");//要归档的文件对象File targetTarFile = new File("c:/upload.tar");//归档后的文件名TarOutputStream out = null;boolean boo = false;//是否压缩成功try{out = new TarOutputStream(new BufferedOutputStream(new FileOutputStream(targetTarFile)));tar(srcFile, out, "", true);boo = true;//归档成功return targetTarFile;}catch(IOException ex){throw new RuntimeException(ex);}finally{try{if(out!=null)out.close();}catch(IOException ex){throw new RuntimeException("关闭Tar输出流出现异常",ex);}finally{//清理操作if(!boo && targetTarFile.exists())//归档不成功,targetTarFile.delete();}}}/** * 测试压缩归档tar.gz文件 */public void testTarGz(){File tarFile = testTar();//生成的tar文件File gzFile = new File(tarFile + ".gz");//将要生成的压缩文件GZIPOutputStream out = null;InputStream in = null;boolean boo = false;//是否成功try{in = new FileInputStream(tarFile);out = new GZIPOutputStream(new FileOutputStream(gzFile),1024 * 2);byte b[] = new byte[1024 * 2];int length = 0;while( (length = in.read(b)) != -1 ){out.write(b,0,length);}boo = true;}catch(Exception ex){throw new RuntimeException("压缩归档文件失败",ex);}finally{try{if(out!=null)out.close();if(in!=null)in.close();}catch(IOException ex){throw new RuntimeException("关闭流出现异常",ex);}finally{if(!boo){//清理操作tarFile.delete();if(gzFile.exists())gzFile.delete();}}}}/** * 测试解压归档tar文件 */public void testUnTar(){File srcTarFile = new File("c:/upload.tar");//要解压缩的tar文件对象String destDir = "c:/XZou";//把解压的文件放置到c盘下的XZou目录下面boolean boo = false;//是否压缩成功try {unTar(srcTarFile,destDir);boo = true;} catch (IOException e) {throw new RuntimeException(e);}finally{//清理操作if(!boo)deleteDirectory(new File(destDir));//目标文件夹 。清理}}/** * 测试解压归档tar文件 */public void testUnTarGz(){File srcTarGzFile = new File("c:/up.tar.gz");//要解压缩的tar.gz文件对象String destDir = "c:/XZou";//把解压的文件放置到c盘下的XZou目录下面boolean boo = false;//是否压缩成功try {unTarGz(srcTarGzFile,destDir);boo = true;} catch (IOException e) {throw new RuntimeException(e);}finally{//清理操作if(!boo)deleteDirectory(new File(destDir));//目标文件夹 。清理}}public static void main(String[] args) throws Exception {XZouTarAndGz jtar = new XZouTarAndGz();//jtar.testTar();//jtar.testTarGz();//jtar.testUnTar();jtar.testUnTarGz();}/** * 归档tar文件 * @param file 归档的文件对象 * @param out 输出tar流 * @param dir 相对父目录名称 * @param boo 是否把空目录归档进去 */public static void tar(File file,TarOutputStream out,String dir,boolean boo) throws IOException{if(file.isDirectory()){//是目录File []listFile = file.listFiles();//得出目录下所有的文件对象if(listFile.length == 0 && boo){//空目录归档out.putNextEntry(new TarEntry(dir + file.getName() + "/"));//将实体放入输出Tar流中System.out.println("归档." + dir + file.getName() + "/");return;}else{for(File cfile: listFile){tar(cfile,out,dir + file.getName() + "/",boo);//递归归档}}}else if(file.isFile()){//是文件System.out.println("归档." + dir + file.getName() + "/");byte[] bt = new byte[2048*2]; TarEntry ze = new TarEntry(dir+file.getName());//构建tar实体 //设置压缩前的文件大小 ze.setSize(file.length()); //ze.setName(file.getName());//设置实体名称.使用默认名称 out.putNextEntry(ze);////将实体放入输出Tar流中 FileInputStream fis = null; try{ fis = new FileInputStream(file); int i=0; while((i = fis.read(bt)) != -1) {//循环读出并写入输出Tar流中 out.write(bt, 0, i); } }catch(IOException ex){ throw new IOException("写入归档文件出现异常",ex); }finally{ try{ if (fis != null) fis.close();//关闭输入流 out.closeEntry(); }catch(IOException ex){ throw new IOException("关闭输入流出现异常"); } } }}/** * 解压tar File * @param file 要解压的tar文件对象 * @param outputDir 要解压到某个指定的目录下 * @throws IOException */public void unTar(File file,String outputDir) throws IOException {TarInputStream tarIn = null;try{tarIn = new TarInputStream(new FileInputStream(file),1024 * 2);createDirectory(outputDir,null);//创建输出目录TarEntry entry = null;while( (entry = tarIn.getNextEntry()) != null ){if(entry.isDirectory()){//是目录createDirectory(outputDir,entry.getName());//创建空目录}else{//是文件File tmpFile = new File(outputDir + "/" + entry.getName());createDirectory(tmpFile.getParent() + "/",null);//创建输出目录OutputStream out = null;try{out = new FileOutputStream(tmpFile);int length = 0;byte[] b = new byte[2048];while((length = tarIn.read(b)) != -1){out.write(b, 0, length);}}catch(IOException ex){throw ex;}finally{if(out!=null)out.close();}}}}catch(IOException ex){throw new IOException("解压归档文件出现异常",ex);} finally{try{if(tarIn != null){tarIn.close();}}catch(IOException ex){throw new IOException("关闭tarFile出现异常",ex);}}}/** * 解压tar.gz 文件 * @param file 要解压的tar.gz文件对象 * @param outputDir 要解压到某个指定的目录下 * @throws IOException */public void unTarGz(File file,String outputDir) throws IOException{TarInputStream tarIn = null;try{tarIn = new TarInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))),1024 * 2);createDirectory(outputDir,null);//创建输出目录TarEntry entry = null;while( (entry = tarIn.getNextEntry()) != null ){if(entry.isDirectory()){//是目录createDirectory(outputDir,entry.getName());//创建空目录}else{//是文件File tmpFile = new File(outputDir + "/" + entry.getName());createDirectory(tmpFile.getParent() + "/",null);//创建输出目录OutputStream out = null;try{out = new FileOutputStream(tmpFile);int length = 0;byte[] b = new byte[2048];while((length = tarIn.read(b)) != -1){out.write(b, 0, length);}}catch(IOException ex){throw ex;}finally{if(out!=null)out.close();}}}}catch(IOException ex){throw new IOException("解压归档文件出现异常",ex);} finally{try{if(tarIn != null){tarIn.close();}}catch(IOException ex){throw new IOException("关闭tarFile出现异常",ex);}}}/** * 构建目录 * @param outputDir * @param subDir */public void createDirectory(String outputDir,String subDir){File file = new File(outputDir);if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空file = new File(outputDir + "/" + subDir);}if(!file.exists()){file.mkdirs();}}/** * 清理文件(目录或文件) * @param file */public void deleteDirectory(File file){if(file.isFile()){file.delete();//清理文件}else{File list[] = file.listFiles();if(list!=null){for(File f: list){deleteDirectory(f);}file.delete();//清理目录}}}}

另利用这些,制作了一个java工具实现压缩(zip,tar,tar.gz,tar.bz2)功能.地址是http://lhxctc.iteye.com/blog/709492

热点排行