JDK自带的zip AIP在java.util.zip包下面,主要有以下几个类:
java.util.zip.ZipEntry
java.util.zip.ZipInputStream
java.util.zip.ZipOutputStream
本文编写的zip工具类有以下功能:打包(单个文件、目录)、解包、查看zip包文件
工具类代码如下
1 package org.net5ijy.util.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.FileOutputStream; 8 import java.io.IOException; 9 import java.util.ArrayList; 10 import java.util.List; 11 import java.util.zip.ZipEntry; 12 import java.util.zip.ZipInputStream; 13 import java.util.zip.ZipOutputStream; 14 15 /** 16 * ZIP工具类 17 * 18 */ 19 public class ZipUtil { 20 21 /** 22 * 解包时的读写大小:10MB 23 */ 24 private static final int SIZE = 1024 * 1024 * 10; 25 26 /** 27 * 打包 28 * 29 * @param src 30 * - 需要打包的文件或目录,不可以是根目录,为根目录时抛出IOException 31 * @param zipFile 32 * - 打包后的.zip文件 33 * @throws IOException 34 */ 35 public static void zip(File src, File zipFile) throws IOException { 36 37 // 不可以压缩根目录 38 if (src.getParent() == null) { 39 throw new IOException("不可以压缩根目录"); 40 } 41 // 获取基目录 42 String base = src.getParentFile().getAbsolutePath(); 43 44 ZipOutputStream out = null; 45 BufferedOutputStream bos = null; 46 47 try { 48 49 out = new ZipOutputStream(new FileOutputStream(zipFile)); 50 51 // 创建缓冲输出流 52 bos = new BufferedOutputStream(out); 53 54 // 调用函数 55 zip(out, bos, src, base); 56 57 } catch (IOException e) { 58 e.printStackTrace(); 59 throw e; 60 } finally { 61 // 关闭流 62 if (bos != null) { 63 bos.close(); 64 } 65 if (out != null) { 66 out.close(); 67 } 68 } 69 } 70 71 private static void zip(ZipOutputStream out, BufferedOutputStream bos, 72 File sourceFile, String base) throws IOException { 73 74 // 如果路径为目录(文件夹) 75 if (sourceFile.isDirectory()) { 76 out.putNextEntry(new ZipEntry(sourceFile.getAbsolutePath().replace( 77 base + File.separator, "") 78 + "/")); 79 // 取出文件夹中的文件(或子文件夹) 80 File[] flist = sourceFile.listFiles(); 81 if (flist.length > 0) { 82 for (int i = 0; i < flist.length; i++) { 83 zip(out, bos, flist[i], base); 84 } 85 } 86 } else {// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中 87 out.putNextEntry(new ZipEntry(sourceFile.getAbsolutePath().replace( 88 base + File.separator, ""))); 89 BufferedInputStream bis = null; 90 try { 91 // 文件输入流 92 bis = new BufferedInputStream(new FileInputStream(sourceFile)); 93 int b = bis.read(); 94 // 将源文件写入到zip文件中 95 while (b > -1) { 96 bos.write(b); 97 b = bis.read(); 98 } 99 bos.flush(); 100 } catch (Exception e) { 101 throw e; 102 } finally { 103 if (bis != null) { 104 bis.close(); 105 } 106 } 107 } 108 } 109 110 /** 111 * 解包 112 * 113 * @param zipFile 114 * - 需要解包的.zip文件 115 * @param targetFolder 116 * - 目标目录 117 * @throws IOException 118 */ 119 public static void unzip(File zipFile, File targetFolder) 120 throws IOException { 121 122 // 如果源文件是null 或者 不是一个文件 123 if (zipFile == null || !zipFile.isFile() 124 || !zipFile.getName().endsWith(".zip")) { 125 throw new IOException("请选择正确的.zip文件"); 126 } 127 128 // 如果目标目录为null 或者 不是一个目录 129 if (targetFolder == null || !targetFolder.isDirectory()) { 130 throw new IOException("请选择正确的解压目录"); 131 } 132 133 // 定义zip文件输入流 134 ZipInputStream zin = null; 135 136 try { 137 138 // 从zipFile创建对应的ZipInputStream输入流 139 zin = new ZipInputStream(new FileInputStream(zipFile)); 140 141 // 获取下一个条目 142 for (ZipEntry entry = zin.getNextEntry(); entry != null; entry = zin 143 .getNextEntry()) { 144 145 // 获取文件或者目录名 146 String name = entry.getName(); 147 // 目录 148 if (name.endsWith("/")) { 149 File dir = new File(targetFolder, name); 150 dir.mkdirs(); 151 } else {// 文件 152 unzip(targetFolder, zin, name); 153 } 154 } 155 } catch (IOException e) { 156 e.printStackTrace(); 157 throw e; 158 } finally { 159 if (zin != null) { 160 zin.close(); 161 } 162 } 163 } 164 165 private static void unzip(File targetFolder, ZipInputStream zin, String name) 166 throws IOException { 167 168 // 定义输出流 169 FileOutputStream out = null; 170 171 try { 172 173 // 创建输出流 174 out = new FileOutputStream(new File(targetFolder.getAbsolutePath() 175 + File.separator + name)); 176 177 byte[] buf = new byte[SIZE]; 178 int len = zin.read(buf); 179 180 while (len > -1) { 181 out.write(buf, 0, len); 182 len = zin.read(buf); 183 } 184 out.flush(); 185 186 } catch (Exception e) { 187 throw e; 188 } finally { 189 if (out != null) { 190 out.close(); 191 } 192 } 193 } 194 195 /** 196 * 获取.zip文件中的条目集合 197 * 198 * @param zipFile 199 * - 待查看的.zip文件 200 * @return 条目的集合 201 * @throws IOException 202 */ 203 public static List<ZipEntry> zipEntryList(File zipFile) throws IOException { 204 205 // 如果源文件是null 或者 不是一个文件 206 if (zipFile == null || !zipFile.isFile()) { 207 throw new IOException("请选择正确的.zip文件"); 208 } 209 210 // 定义zip文件输入流 211 ZipInputStream zin = null; 212 213 List<ZipEntry> l = new ArrayList<ZipEntry>(); 214 215 try { 216 // 从zipFile创建对应的ZipInputStream输入流 217 zin = new ZipInputStream(new FileInputStream(zipFile)); 218 // 获取下一个条目 219 ZipEntry entry = zin.getNextEntry(); 220 221 while (entry != null) { 222 l.add(entry); 223 entry = zin.getNextEntry(); 224 } 225 } catch (IOException e) { 226 e.printStackTrace(); 227 throw e; 228 } finally { 229 if (zin != null) { 230 zin.close(); 231 } 232 } 233 return l; 234 } 235 236 /** 237 * 获取.zip文件中的条目名称集合 238 * 239 * @param zipFile 240 * - 待查看的.zip文件 241 * @return 条目名称集合 242 * @throws IOException 243 */ 244 public static List<String> zipEntryNameList(File zipFile) 245 throws IOException { 246 List<String> l = new ArrayList<String>(); 247 List<ZipEntry> entryList = zipEntryList(zipFile); 248 for (ZipEntry zipEntry : entryList) { 249 l.add(zipEntry.getName()); 250 } 251 return l; 252 } 253 }
测试代码
1 import static org.net5ijy.util.zip.ZipUtil.*; 2 3 public class ZipUtilTest { 4 5 public static void main(String[] args) throws IOException { 6 7 zip(new File( 8 "D:\workspace\SpringCloud\zip-demo\src\org\net5ijy\util\zip\ZipUtil.java"), 9 new File("d:\zip01.zip")); 10 11 zip(new File("D:\workspace\SpringCloud\spring-data-demo2\"), 12 new File("d:\zip02.zip")); 13 14 unzip(new File("d:\zip02.zip"), new File("D:\a\")); 15 16 List<String> nameList = zipEntryNameList(new File("d:\zip02.zip")); 17 for (String name : nameList) { 18 System.out.println(name); 19 } 20 } 21 }