1 package com.ao.zip; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.util.zip.CRC32; 11 import java.util.zip.CheckedOutputStream; 12 import java.util.zip.ZipEntry; 13 import java.util.zip.ZipOutputStream; 14 15 public class FileToZip { 16 17 private static final int BUFFER = 8192; 18 19 private File zipFile; 20 21 public FileToZip(){}; 22 23 public FileToZip(String pathName){ 24 zipFile = new File(pathName); 25 String mkdirPath = pathName.substring(0, pathName.lastIndexOf("/")); 26 File mkdir = new File(mkdirPath); 27 if(!mkdir.exists()){ 28 mkdir.mkdirs(); 29 } 30 }; 31 32 public FileToZip(String pathName, String fileName){ 33 zipFile = new File(pathName + "/" + fileName); 34 File mkdir = new File(pathName); 35 if(!mkdir.exists()){ 36 mkdir.mkdirs(); 37 } 38 }; 39 40 /** 41 * 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下 42 * @param sourceFilePath :待压缩的文件路径 43 * @param zipFilePath :压缩后存放路径 44 * @param fileName :压缩后文件的名称 45 * @return 46 */ 47 public static boolean fileToZip(String sourceFilePath, 48 String zipFilePath, String fileName){ 49 boolean flag = false; 50 File sourceFile = new File(sourceFilePath); 51 FileInputStream fis = null; 52 BufferedInputStream bis = null; 53 FileOutputStream fos = null; 54 ZipOutputStream zos = null; 55 if(!sourceFile.exists()){ 56 System.err.println("待压缩的文件目录:" + sourceFilePath + "不存在."); 57 }else{ 58 try { 59 File zippath = new File(zipFilePath); 60 if(!zippath.exists()){ 61 zippath.mkdirs(); 62 } 63 File zipFile = new File(zipFilePath + "/" + fileName + ".zip"); 64 if(zipFile.exists()){ 65 System.err.println(zipFilePath + "目录下存在文件名为:" + fileName + ".zip的打包文件."); 66 System.err.println("正在删除中..."); 67 System.err.println(zipFilePath + "/" + fileName + ".zip"); 68 zipFile.delete(); 69 } 70 File[] sourceFiles = sourceFile.listFiles(); 71 if(sourceFiles == null || sourceFiles.length < 1){ 72 System.err.println("待压缩的文件目录:" + sourceFilePath + "里面不存在文件,无需压缩."); 73 }else{ 74 fos = new FileOutputStream(zipFile); 75 zos = new ZipOutputStream(new BufferedOutputStream(fos)); 76 byte[] bufs = new byte[1024*10]; 77 for(int i = 0; i < sourceFiles.length; i++){ 78 //创建ZIP实体,并添加进压缩包 79 ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName()); 80 zos.putNextEntry(zipEntry); 81 //读取待压缩的文件并写进压缩包里 82 fis = new FileInputStream(sourceFiles[i]); 83 bis = new BufferedInputStream(fis, 1024*10); 84 int read = 0; 85 while((read = bis.read(bufs, 0, 1024*10)) != -1){ 86 zos.write(bufs, 0, read); 87 } 88 } 89 flag = true; 90 } 91 }catch (FileNotFoundException e) { 92 e.printStackTrace(); 93 throw new RuntimeException(e); 94 }catch (IOException e) { 95 e.printStackTrace(); 96 throw new RuntimeException(e); 97 }finally{ //关闭流 98 try{ 99 if(bis != null){100 bis.close();101 }102 if(zos != null){103 zos.close();104 }105 }catch(IOException e){106 e.printStackTrace();107 throw new RuntimeException(e);108 }109 }110 }111 return flag;112 }113 114 public void fileToZip(String...pathName){115 ZipOutputStream out = null;116 try{117 FileOutputStream fileOutputStream = new FileOutputStream(zipFile);118 CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());119 out = new ZipOutputStream(cos);120 String basedir = "";121 for(int i = 0; i < pathName.length; i++){122 fileToZip(new File(pathName[i]), out, basedir);123 }124 }catch(FileNotFoundException e){125 e.printStackTrace();126 throw new RuntimeException(e);127 }finally{128 try{129 if(out != null){130 out.close();131 }132 }catch(IOException e){133 e.printStackTrace();134 throw new RuntimeException(e);135 }136 }137 }138 139 public void fileToZip(String srcPathName){140 File file = new File(srcPathName); 141 ZipOutputStream out = null;142 if(!file.exists()){143 throw new RuntimeException(srcPathName + "不存在!"); 144 } 145 try{ 146 FileOutputStream fileOutputStream = new FileOutputStream(zipFile); 147 CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, 148 new CRC32()); 149 out = new ZipOutputStream(cos); 150 String basedir = ""; 151 fileToZip(file, out, basedir); 152 }catch(FileNotFoundException e) { 153 throw new RuntimeException(e); 154 }finally{155 try{156 if(out != null){157 out.close();158 }159 }catch(IOException e){160 e.printStackTrace();161 throw new RuntimeException(e);162 }163 } 164 }165 166 private void fileToZip(File file, ZipOutputStream out, String basedir) { 167 /* 判断是目录还是文件 */ 168 if (file.isDirectory()) { 169 System.out.println("压缩:" + basedir + file.getName()); 170 this.fileToZipDirectory(file, out, basedir); 171 } else { 172 System.out.println("压缩:" + basedir + file.getName()); 173 this.fileToZipFile(file, out, basedir); 174 } 175 }176 177 /** 压缩一个目录 */ 178 private void fileToZipDirectory(File dir, ZipOutputStream out, String basedir) { 179 if (!dir.exists()) 180 return;181 182 File[] files = dir.listFiles(); 183 for (int i = 0; i < files.length; i++) { 184 /* 递归 */ 185 fileToZip(files[i], out, basedir + dir.getName() + "/"); 186 } 187 } 188 189 /** 压缩一个文件 */ 190 private void fileToZipFile(File file, ZipOutputStream out, String basedir) { 191 if(!file.exists()){192 return;193 }194 try{195 BufferedInputStream bis = new BufferedInputStream( 196 new FileInputStream(file)); 197 ZipEntry entry = new ZipEntry(basedir + file.getName()); 198 out.putNextEntry(entry); 199 int count;200 byte data[] = new byte[BUFFER]; 201 while ((count = bis.read(data, 0, BUFFER)) != -1) { 202 out.write(data, 0, count); 203 }204 bis.close(); 205 } catch (Exception e) {206 throw new RuntimeException(e);207 }208 }209 210 // public static void main(String[] args) {211 // String sourceFilePath = "E:/Test/aaa.txt";212 // String zipFilePath = "E:";213 // String fileName = "aaa";214 // System.err.println(fileToZip(sourceFilePath, zipFilePath, fileName));215 // FileToZip zc = new FileToZip("E:/resource", "resource.zip");216 // zc.fileToZip("E:/Test", "E:/临洮");217 // }218 219 }