package Util; 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.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtil { private static ZipUtil ziputil=new ZipUtil(); public static ZipUtil getInstance(){ return ziputil; } /**测试用例 * @param args */ public static void main(String[] args) { try { // ZipUtil.zip(new String[]{"D:\\zip\\TestSub.txt"}, "D:\\zip\\ziptest.zip"); // ZipUtil.unzip("D:\\zip\\ziptest.zip", "D:\\zip"); // ZipUtil.getInstance().zip("D:\\zipsource.rar", "D:\\zip"); ZipUtil.getInstance().unzipDirectory("D:\\zipsource.rar", "D:\\zip"); } catch (Exception e) { e.printStackTrace(); } } /** * 文件压缩 * @param files 要解压缩的文件 * @param destZip 压缩之后的zip文件所放的目录,需要"D:\\"或"D:\\test\"格式 * @throws IOException */ public static void zip(String[] files, String destZip) throws IOException { FileOutputStream fos = new FileOutputStream(destZip); BufferedOutputStream bos = new BufferedOutputStream(fos); ZipOutputStream zos = new ZipOutputStream(bos); for (int i = 0; i < files.length; i++) { String file = files[i]; FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); File f = new File(file); ZipEntry zl = new ZipEntry(f.getName()); zos.putNextEntry(zl); int tmp = -1; while ((tmp = bis.read()) != -1) { zos.write(tmp); } zos.closeEntry(); bis.close(); fis.close(); } zos.close(); bos.close(); fos.close(); } /** * 文件解压缩 * @param zipfile 要解压缩的zip文件 * @param destpath 解压后文件所放的目录,需要“D:\\”或“D:\\test”格式 * @throws IOException */ public static void unzip(String zipfile,String destpath) throws IOException{ FileInputStream fis=new FileInputStream(zipfile); ZipInputStream zis=new ZipInputStream(fis); ZipEntry zl=null; while((zl=zis.getNextEntry())!=null){ if(zl.isDirectory()){ // destpath+="\\"+zl.getName(); File f=new File(destpath+"\\"+zl.getName()); f.mkdirs(); }else{ String file=zl.getName(); FileOutputStream fos=new FileOutputStream(destpath+"\\"+file); int tmp=-1; while((tmp=zis.read())!=-1) { fos.write(tmp); } zis.closeEntry(); fos.close(); } } zis.close(); } /** * 压缩目录 * @param zipFileName 压缩后zip文件的路径 * @param inputFile 需要压缩的源目录 * @throws IOException */ public void zip(String zipFileName,String inputFile) throws IOException{ File file=new File(inputFile); ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipFileName)); zip(out,file,""); System.out.println("zip done"); out.close(); } /** *递归遍历子目录和文件,进行压缩 * @param out * @param f * @param base * @throws IOException */ private void zip(ZipOutputStream out, File f, String base) throws IOException { System.out.println("Zipping"+f.getName()); 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(); } } /** * 解压缩目录 * @param zipFileName 需要压缩的文件 * @param outputDirectory 解压缩后文件所放路径 * @throws Exception */ public void unzipDirectory(String zipFileName,String outputDirectory) throws Exception{ ZipInputStream in=new ZipInputStream(new FileInputStream(zipFileName)); ZipEntry z; while((z=in.getNextEntry())!=null){ System.out.println("unziping "+z.getName()); if(z.isDirectory()){ String name=z.getName(); name=name.substring(0, name.length()-1); File f=new File(outputDirectory+File.separator+name); f.mkdirs(); System.out.println("mkdir "+outputDirectory+File.separator+name); }else{ File f=new File(outputDirectory+File.separator+z.getName()); f.createNewFile(); FileOutputStream out=new FileOutputStream(f); int b; while((b=in.read())!=-1){ out.write(b); } out.close(); } } in.close(); } }