Java解压zip文件

代码如下:

/**
 * 解压文件
 * @param filePath 源文件
 * @param targetPath 解压后文件
 * @param delete 解压是否删除原文件
 */
public static void unzip(String filePath, String targetPath, boolean delete) {
    if(StringUtils.isEmpty(targetPath) || StringUtils.isEmpty(filePath))
        return;
    File file = new File(filePath);
    if(!file.exists() || !file.isFile())
        return;
    if(!targetPath.endsWith("/"))
        targetPath += "/";
    Tools.createFile(targetPath, true);
    InputStream is = null;
    ZipInputStream zis = null;
    try {
        is = new FileInputStream(filePath);
        zis = new ZipInputStream(is, Charset.forName("UTF-8"));
        java.util.zip.ZipEntry entry = null;
        while((entry = zis.getNextEntry()) != null) {
            String extPath = targetPath + entry.getName();
            Tools.createFile(extPath, entry.isDirectory()); // 创建文件或文件夹,代码见后面
            if(entry.isDirectory()) // 如果不是文件不需要后面操作
                continue;
            byte[] data = new byte[read_buffer];
            int index = 0;
            OutputStream os = null;
            try {
                os = new FileOutputStream(new File(extPath));
                while((index = zis.read(data)) != -1) {
                    os.write(data, 0, index);
                }
                os.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(os);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(is);
        IOUtils.closeQuietly(zis);
    }
    if(delete)
        file.delete();
}

上面的创建文件路径方法:

/**
 * 创建文件夹
 * @param path 文件地址
 * @param isDirectory 是否是文件夹
 */
public static final void createFile(String path, boolean isDirectory) {
    if(StringUtils.isNotEmpty(path)) {
        File file = new File(path);
        if(!file.exists()) {
            if(isDirectory) {
                file.mkdirs();
            } else {
                if(!file.getParentFile().exists())
                    file.getParentFile().mkdirs();
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

不过遇到中文是会遇到问题,可以使用ant.jar解决,完整DEMO:

package com.acgist.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 使用时请添加ant-x.x.x.jar
 * 解决linux乱码
 */
public class ZipUtils {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ZipUtils.class);
	
	/**
	 * file打包
	 * 
	 * @param files 需要压缩的文件数组
	 * @param output 输出流,使用完毕会关闭
	 */
	private final static void zip(File[] files, OutputStream output) {
		if(ArrayUtils.isEmpty(files) || output == null) {
			return;
		}
		try(ZipOutputStream zipOutput = new ZipOutputStream(output);) {
			zipOutput.setEncoding("UTF-8");
			for (File file : files) {
				if(file != null) {
					addZip(zipOutput, file);
				}
			}
		} catch (Exception e) {
			LOGGER.error("Zip打包异常", e);
		}
	}
	
	/**
	 * 添加压缩文件
	 */
	private static final void addZip(ZipOutputStream zipOutput, File file) {
		try(InputStream input = new FileInputStream(file);) {
			ZipEntry entry = new ZipEntry(file.getName());
			entry.setUnixMode(644); // linux乱码
			zipOutput.putNextEntry(entry);
			int len;
			byte[] bytes = new byte[1024];
			while ((len = input.read(bytes)) != -1) {
				zipOutput.write(bytes, 0, len);
			}
			zipOutput.flush();
		} catch (IOException e) {
			LOGGER.error("Zip打包异常", e);
		}
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param file 需要压缩的文件
	 * @param out 输出流,自动关闭
	 */
	public final static void zip(File file, OutputStream out) {
		if(file == null || out == null) {
			return;
		}
		File[] files = new File[1];
		files[0] = file;
		zip(files, out);
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param file 需要压缩的文件
	 * @param outPath 输出地址
	 * 
	 * @return 输出地址
	 */
	public final static String zip(File file, String outPath) {
		if(file == null || StringUtils.isEmpty(outPath)) {
			return null;
		}
		try(OutputStream output = new FileOutputStream(new File(outPath));) {
			CommonUtils.mkdirs(file, true);
			zip(file, output);
		} catch (IOException e) {
			LOGGER.error("文件找不到", e);
		}
		return outPath;
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param files 需要压缩的文件数组
	 * @param outPath 输出地址
	 * 
	 * @return 输出地址
	 */
	public final static String zip(File[] files, String outPath) {
		if(ArrayUtils.isEmpty(files) || StringUtils.isEmpty(outPath)) {
			return null;
		}
		try(OutputStream out = new FileOutputStream(new File(outPath))) {
			CommonUtils.mkdirs(outPath, true);
			zip(files, out);
		} catch (IOException e) {
			LOGGER.error("文件找不到", e);
		}
		return outPath;
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param filePath 压缩文件地址
	 * @param outPath 输出文件地址
	 * 
	 * @return 压缩文件地址
	 */
	public final static String zip(String filePath, String outPath) {
		if(StringUtils.isEmpty(filePath) || StringUtils.isEmpty(outPath)) {
			return null;
		}
		return zip(new File(filePath), outPath);
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param filePaths 压缩文件地址的数组
	 * @param outPath 输出文件地址
	 * 
	 * @return 压缩文件地址
	 */
	public final static String zip(String[] filePaths, String outPath) {
		if(ArrayUtils.isEmpty(filePaths) || StringUtils.isEmpty(outPath)) {
			return null;
		}
		File[] files = new File[filePaths.length];
		for (int i = 0; i < filePaths.length; i++) {
			files[i] = new File(filePaths[i]);
		}
		return zip(files, outPath);
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param filePaths 压缩文件地址的数组
	 * @param output 输出流
	 */
	public final static void zip(String[] filePaths, OutputStream output) {
		if(ArrayUtils.isEmpty(filePaths) || output == null) {
			return;
		}
		File[] files = new File[filePaths.length];
		for (int i = 0; i < filePaths.length; i++) {
			files[i] = new File(filePaths[i]);
		}
		zip(files, output);
	}
	
	/**
	 * 压缩文件
	 * 
	 * @param filePath 压缩文件地址
	 * @param output 输出流
	 */
	public final static void zip(String filePath, OutputStream output) {
		if(StringUtils.isEmpty(filePath) || output == null) {
			return;
		}
		zip(new File(filePath), output);
	}
	
}