Java 工具类 - Zip压缩解压

注意:此类中用到的压缩类ZipEntry等都来自于org.apache.tools包而非java.util包
依赖:ant-1.7.1.jar

package com.tgb.hz.file;

import com.tgb.hz.common.ArrayUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Enumeration;

/**
 * 

zip 工具类

* *

注意:此类中用到的压缩类ZipEntry等都来自于org.apache.tools包而非java.util包

*

依赖:ant-1.7.1.jar

* * @author hezhao * @Time 2017年7月28日 下午3:23:41 */ public class ZipUtil { private static final Logger logger = LoggerFactory.getLogger(ZipUtil.class); /** * 使用GBK编码可以避免压缩中文文件名乱码 */ private static final String CHINESE_CHARSET = "GBK"; /** * 文件读取缓冲区大小 */ private static final int CACHE_SIZE = 1024; private ZipUtil(){ // 私用构造主法.因为此类是工具类. } /** *

* 压缩文件 *

* * @param sourceFolder 需压缩文件 或者 文件夹 路径 * @param zipFilePath 压缩文件输出路径 * @throws Exception */ public static void zip(String sourceFolder, String zipFilePath) throws Exception { logger.debug("开始压缩 ["+sourceFolder+"] 到 ["+zipFilePath+"]"); OutputStream out = new FileOutputStream(zipFilePath); BufferedOutputStream bos = new BufferedOutputStream(out); org.apache.tools.zip.ZipOutputStream zos = new org.apache.tools.zip.ZipOutputStream(bos); // 解决中文文件名乱码 zos.setEncoding(CHINESE_CHARSET); File file = new File(sourceFolder); String basePath = null; if (file.isDirectory()) { basePath = file.getPath(); } else { basePath = file.getParent(); } zipFile(file, basePath, zos); zos.closeEntry(); zos.close(); bos.close(); out.close(); logger.debug("压缩 ["+sourceFolder+"] 完成!"); } /** *

* 压缩文件 *

* * @param sourceFolders 一组 压缩文件夹 或 文件 * @param zipFilePath 压缩文件输出路径 * @throws Exception */ public static void zip(String[] sourceFolders, String zipFilePath) throws Exception { OutputStream out = new FileOutputStream(zipFilePath); BufferedOutputStream bos = new BufferedOutputStream(out); org.apache.tools.zip.ZipOutputStream zos = new org.apache.tools.zip.ZipOutputStream(bos); // 解决中文文件名乱码 zos.setEncoding(CHINESE_CHARSET); for (int i = 0; i < sourceFolders.length; i++) { logger.debug("开始压缩 ["+sourceFolders[i]+"] 到 ["+zipFilePath+"]"); File file = new File(sourceFolders[i]); String basePath = null; basePath = file.getParent(); zipFile(file, basePath, zos); } zos.closeEntry(); zos.close(); bos.close(); out.close(); logger.debug("压缩 "+ArrayUtil.join(sourceFolders)+" 完成!"); } /** *

* 递归压缩文件 *

* * @param parentFile * @param basePath * @param zos * @throws Exception */ private static void zipFile(File parentFile, String basePath, org.apache.tools.zip.ZipOutputStream zos) throws Exception { File[] files = new File[0]; if (parentFile.isDirectory()) { files = parentFile.listFiles(); } else { files = new File[1]; files[0] = parentFile; } String pathName; InputStream is; BufferedInputStream bis; byte[] cache = new byte[CACHE_SIZE]; for (File file : files) { if (file.isDirectory()) { logger.debug("目录:"+file.getPath()); basePath = basePath.replace('\\', '/'); if(basePath.substring(basePath.length()-1).equals("/")){ pathName = file.getPath().substring(basePath.length()) + "/"; }else{ pathName = file.getPath().substring(basePath.length() + 1) + "/"; } zos.putNextEntry(new org.apache.tools.zip.ZipEntry(pathName)); zipFile(file, basePath, zos); } else { pathName = file.getPath().substring(basePath.length()) ; pathName = pathName.replace('\\', '/'); if(pathName.substring(0,1).equals("/")){ pathName = pathName.substring(1); } logger.debug("压缩:"+pathName); is = new FileInputStream(file); bis = new BufferedInputStream(is); zos.putNextEntry(new org.apache.tools.zip.ZipEntry(pathName)); int nRead = 0; while ((nRead = bis.read(cache, 0, CACHE_SIZE)) != -1) { zos.write(cache, 0, nRead); } bis.close(); is.close(); } } } /** * 解压zip文件 * * @param zipFileName * 待解压的zip文件路径,例如:c:\\a.zip * * @param outputDirectory * 解压目标文件夹,例如:c:\\a\ */ public static void unZip(String zipFileName, String outputDirectory) throws Exception { logger.debug("开始解压 ["+zipFileName+"] 到 ["+outputDirectory+"]"); org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName); try { Enumeration e = zipFile.getEntries(); org.apache.tools.zip.ZipEntry zipEntry = null; createDirectory(outputDirectory, ""); while (e.hasMoreElements()) { zipEntry = (org.apache.tools.zip.ZipEntry) e.nextElement(); logger.debug("解压:" + zipEntry.getName()); if (zipEntry.isDirectory()) { String name = zipEntry.getName(); name = name.substring(0, name.length() - 1); File f = new File(outputDirectory + File.separator + name); f.mkdir(); logger.debug("创建目录:" + outputDirectory + File.separator + name); } else { String fileName = zipEntry.getName(); fileName = fileName.replace('\\', '/'); if (fileName.indexOf("/") != -1) { createDirectory(outputDirectory, fileName.substring(0, fileName.lastIndexOf("/"))); fileName = fileName.substring( fileName.lastIndexOf("/") + 1, fileName.length()); } File f = new File(outputDirectory + File.separator + zipEntry.getName()); f.createNewFile(); InputStream in = zipFile.getInputStream(zipEntry); FileOutputStream out = new FileOutputStream(f); byte[] by = new byte[1024]; int c; while ((c = in.read(by)) != -1) { out.write(by, 0, c); } in.close(); out.close(); } } logger.debug("解压 ["+zipFileName+"] 完成!"); } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { zipFile.close(); } } /** * 创建目录 * @author hezhao * @Time 2017年7月28日 下午7:10:05 * @param directory * @param subDirectory */ private static void createDirectory(String directory, String subDirectory) { String dir[]; File fl = new File(directory); try { if (subDirectory == "" && fl.exists() != true) { fl.mkdir(); } else if (subDirectory != "") { dir = subDirectory.replace('\\', '/').split("/"); for (int i = 0; i < dir.length; i++) { File subFile = new File(directory + File.separator + dir[i]); if (subFile.exists() == false) subFile.mkdir(); directory += File.separator + dir[i]; } } } catch (Exception ex) { System.out.println(ex.getMessage()); } } /** * 无需解压直接读取Zip文件和文件内容 * @author hezhao * @Time 2017年7月28日 下午3:23:10 * @param file 文件 * @throws Exception */ public static void readZipFile(String file) throws Exception { java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(file); InputStream in = new BufferedInputStream(new FileInputStream(file)); java.util.zip.ZipInputStream zin = new java.util.zip.ZipInputStream(in); java.util.zip.ZipEntry ze; while ((ze = zin.getNextEntry()) != null) { if (ze.isDirectory()) { } else { logger.info("file - " + ze.getName() + " : " + ze.getSize() + " bytes"); long size = ze.getSize(); if (size > 0) { BufferedReader br = new BufferedReader( new InputStreamReader(zipFile.getInputStream(ze))); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } System.out.println(); } } zin.closeEntry(); } public static void main(String[] args) throws Exception { try { // readZipFile("D:\\new1\\文字.zip"); //压缩文件 // String sourceFolder = "D:/新建文本文档.txt"; // String zipFilePath = "D:/新建文本文档.zip"; // ZipUtil.zip(sourceFolder, zipFilePath); //压缩文件夹 // String sourceFolder = "D:/fsc1"; // String zipFilePath = "D:/fsc1.zip"; // ZipUtil.zip(sourceFolder, zipFilePath); //压缩一组文件 // String [] paths = {"D:/新建文本文档.txt","D:\\FastStoneCapturecn.zip","D:/new1"}; // zip(paths, "D:/abc.zip"); // unZip("D:\\FastStoneCapturecn.zip", "D:/fsc2"); } catch (Exception e) { e.printStackTrace(); } } }

你可能感兴趣的:(Java 工具类 - Zip压缩解压)