java zip压缩与解压-支持空目录,保留文件修改时间

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

java zip压缩与解压-支持空目录,保留文件修改时间。
依赖于commons-io,commons-compress

 

[Java]代码    

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.IOUtils;

public class ZipFileUtil {
	/**
	 * 把一个目录打包到一个指定的zip文件中
	 * 
	 * @param dirpath
	 *            目录路径
	 * @param zipPath
	 *            zip文件路径
	 */
	public static void compressFoldToZip(String dirpath, String zipPath) {
		compressFoldToZip(dirpath,zipPath,"");
	}
	/**
	 *  把一个目录打包到一个指定的zip文件中
	 * @param dirpath
	 * @param zipPath
	 * @param entryPath 压缩内文件逻辑路径。如static/
	 */
	public static void compressFoldToZip(String dirpath, String zipPath,String entryPath){
		if(!entryPath.endsWith(File.separator)&&StringUtil.checkNotEmpty(entryPath)){
			entryPath+=File.separator;
		}
		ZipArchiveOutputStream out = null;
		try {
			out = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(new File(zipPath))));
			out.setEncoding("UTF-8");
			compressFoldToZip(out, dirpath, entryPath);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(out);
		}
	}
	/**
	 * 把一个目录打包到一个指定的zip文件中
	 * 
	 * @param out
	 * @param dirpath
	 *            目录路径
	 * @param entryPath
	 *            zip中文件的逻辑路径
	 */
	private static void compressFoldToZip(ZipArchiveOutputStream out, String dirpath, String entryPath) {
		InputStream ins = null;
		File dir = new File(dirpath);
		File[] files = dir.listFiles();
		if (files == null || files.length < 1) {
			return;
		}
		try {

			for (int i = 0; i < files.length; i++) {
				// 判断此文件是否是一个文件夹
				if (files[i].isDirectory()) {
					if(files[i].listFiles().length>0){
						compressFoldToZip(out, files[i].getAbsolutePath(), entryPath + files[i].getName() + File.separator);
					}else{
						addFileToZip(files[i], out, entryPath);
					}
				} else {
					addFileToZip(files[i], out, entryPath);
				}
			}
			out.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(ins);
		}
	}

	private static void addFileToZip(File file, ZipArchiveOutputStream out, String entryPath) {
		InputStream ins = null;
		try {
			
			String path=entryPath + file.getName();
			if(file.isDirectory()){
				path=formatDirPath(path); //为了在压缩文件中包含空文件夹
			}
			ZipArchiveEntry entry = new ZipArchiveEntry(path);
			entry.setTime(file.lastModified());
			// entry.setSize(files[i].length());
			out.putArchiveEntry(entry);
			if(!file.isDirectory()){
				ins = new BufferedInputStream(new FileInputStream(file.getAbsolutePath()));
				IOUtils.copy(ins, out);
			}
			out.closeArchiveEntry();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(ins);
		}
	}

	/**
	 * 解压zip文件到指定目录
	 * 
	 * @param zipPath
	 * @param destDir
	 */
	public static void unZipToFold(String zipPath, String destDir) {
		ZipArchiveInputStream ins = null;
		OutputStream os = null;
		File zip = new File(zipPath);
		if (!zip.exists()) {
			return;
		}
		File dest = new File(destDir);
		if (!dest.exists()) {
			dest.mkdirs();
		}
		destDir=formatDirPath(destDir);
		try {
			ins = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipPath)), "UTF-8");
			ZipArchiveEntry entry = null;
			while ((entry = ins.getNextZipEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
					directory.setLastModified(entry.getTime());
				} else {
					String absPath=formatPath(destDir+entry.getName());
					mkdirsForFile(absPath);
					File tmpFile=new File(absPath);
					os=new BufferedOutputStream(new FileOutputStream(tmpFile));
					IOUtils.copy(ins, os);
					IOUtils.closeQuietly(os);
					tmpFile.setLastModified(entry.getTime());
				}
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(ins);
		}
	}
	private static String formatPath(String path){
		path=path.replace('\\', File.separatorChar);
		path=path.replace('/', File.separatorChar);
		return path;
	}
	private static String formatDirPath(String dir){
		if(!dir.endsWith(File.separator)){
			dir+=File.separator;
		}
		return dir;
	}
	private static void mkdirsForFile(String filePath){
		String absPath=filePath;
		String tmpPath=absPath.substring(0,absPath.lastIndexOf(File.separator));
		File tmp=new File(tmpPath);
		if(!tmp.exists()){
			tmp.mkdirs();
		}
	}
	public static void main(String[] args) {
		compressFoldToZip("D:\\new2\\feiq", "D:\\zip\\my.zip");
//		unZipToFold("D:\\zip\\my.zip", "D:\\zip\\unzip");
	}
}