本文共 5520 字,大约阅读时间需要 18 分钟。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | package com.utility.zip; 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; import com.utility.io.IOUtil; /** * 通过Java的Zip输入输出流实现压缩和解压文件 * * @author liujiduo * */ public final class ZipUtil { private ZipUtil() { // empty } /** * 压缩文件 * * @param filePath * 待压缩的文件路径 * @return 压缩后的文件 */ public static File zip(String filePath) { File target = null ; File source = new File(filePath); if (source.exists()) { // 压缩文件名=源文件名.zip String zipName = source.getName() + ".zip" ; target = new File(source.getParent(), zipName); if (target.exists()) { target.delete(); // 删除旧的文件 } FileOutputStream fos = null ; ZipOutputStream zos = null ; try { fos = new FileOutputStream(target); zos = new ZipOutputStream( new BufferedOutputStream(fos)); // 添加对应的文件Entry addEntry( "/" , source, zos); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zos, fos); } } return target; } /** * 扫描添加文件Entry * * @param base * 基路径 * * @param source * 源文件 * @param zos * Zip文件输出流 * @throws IOException */ private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException { // 按目录分级,形如:/aaa/bbb.txt String entry = base + source.getName(); if (source.isDirectory()) { for (File file : source.listFiles()) { // 递归列出目录下的所有文件,添加文件Entry addEntry(entry + "/" , file, zos); } } else { FileInputStream fis = null ; BufferedInputStream bis = null ; try { byte [] buffer = new byte [ 1024 * 10 ]; fis = new FileInputStream(source); bis = new BufferedInputStream(fis, buffer.length); int read = 0 ; zos.putNextEntry( new ZipEntry(entry)); while ((read = bis.read(buffer, 0 , buffer.length)) != - 1 ) { zos.write(buffer, 0 , read); } zos.closeEntry(); } finally { IOUtil.closeQuietly(bis, fis); } } } /** * 解压文件 * * @param filePath * 压缩文件路径 */ public static void unzip(String filePath) { File source = new File(filePath); if (source.exists()) { ZipInputStream zis = null ; BufferedOutputStream bos = null ; try { zis = new ZipInputStream( new FileInputStream(source)); ZipEntry entry = null ; while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) { File target = new File(source.getParent(), entry.getName()); if (!target.getParentFile().exists()) { // 创建文件父目录 target.getParentFile().mkdirs(); } // 写入文件 bos = new BufferedOutputStream( new FileOutputStream(target)); int read = 0 ; byte [] buffer = new byte [ 1024 * 10 ]; while ((read = zis.read(buffer, 0 , buffer.length)) != - 1 ) { bos.write(buffer, 0 , read); } bos.flush(); } zis.closeEntry(); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zis, bos); } } } public static void main(String[] args) { String targetPath = "E:\\Win7壁纸" ; File file = ZipUtil.zip(targetPath); System.out.println(file); ZipUtil.unzip( "F:\\Win7壁纸.zip" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.utility.io; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * @author liujiduo * */ public class IOUtil { /** * 关闭一个或多个流对象 * * @param closeables * 可关闭的流对象列表 * @throws IOException */ public static void close(Closeable... closeables) throws IOException { if (closeables != null ) { for (Closeable closeable : closeables) { if (closeable != null ) { closeable.close(); } } } } /** * 关闭一个或多个流对象 * * @param closeables * 可关闭的流对象列表 */ public static void closeQuietly(Closeable... closeables) { try { close(closeables); } catch (IOException e) { // do nothing } } } |
转载地址:http://xdnsi.baihongyu.com/
引用来自“Bug_Killer”的评论
阿多,猜猜我是谁引用来自“uk8692”的评论
你这个如果要打包的文件名有中文,会乱码的。用ant.jar里面的ZipEntry就可以解决。引用来自“田龙123”的评论
解压完的文件内的内容没了引用来自“renchhao”的评论
不用说, BUG, 看解压代码,, bos 未在for 循环中关闭。引用来自“田龙123”的评论
解压完的文件内的内容没了引用来自“你的快递”的评论
有个潜在bug: buffer 是静态共享成员变量 如遇并发就会出错