欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解压缩文件

程序员文章站 2022-05-15 10:58:55
...
package cn.com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * <p>
 * Title: 解压缩文件
 * </p>
 * <p>
 * Description: 通过apache的zip工具实现解压缩(ant.jar)
 * </p>
 */
public class CompressFile {
	private static final int BUFFER_SIZE = 1024;

	/**
	 * 压缩文件或者文件目录到指定的zip或者rar包
	 * 
	 * @param inputFilename
	 *            要压缩的文件或者文件夹,如果是文件夹的话,会将文件夹下的所有文件包含子文件夹的内容进行压缩
	 * @param zipFilename
	 *            生成的压缩文件的名称
	 */
	public synchronized void zip(String inputFilename, String zipFilename)
			throws IOException {
		File inputFile = new File(inputFilename);
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
				zipFilename));
		try {
			zip(inputFile, out, "");
		} catch (IOException e) {
			throw e;
		} finally {
			out.close();
		}
	}

	/**
	 * 压缩文件或者文件目录到指定的zip或者rar包
	 * 
	 * @param inputFile
	 *            参数为文件类型的要压缩的文件或者文件夹
	 * @param out
	 *            输出流
	 * @param base
	 *            基文件夹
	 * @return void
	 */
	private synchronized void zip(File inputFile, ZipOutputStream out,
			String base) throws IOException {
		if (inputFile.isDirectory()) {
			File[] inputFiles = inputFile.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (File file : inputFiles) {
				zip(file, out, base + file.getName());
			}
		} else {
			if (base.length() > 0) {
				out.putNextEntry(new ZipEntry(base));
			} else {
				out.putNextEntry(new ZipEntry(inputFile.getName()));
			}

			FileInputStream in = new FileInputStream(inputFile);
			try {
				int length;
				byte[] buffer = new byte[BUFFER_SIZE];
				while ((length = in.read(buffer)) != -1) {
					out.write(buffer, 0, length);
				}
			} catch (IOException e) {
				throw e;
			} finally {
				in.close();
			}
		}
	}

	/**
	 * 解压zip或者rar包的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况
	 * 
	 * @param zipFilename
	 *            要解压的zip或者rar包文件
	 * @param outputDirectory
	 *            解压后存放的目录
	 */
	public synchronized void unzip(String zipFilename, String outputDirectory)
			throws IOException {
		File outFile = new File(outputDirectory);
		if (!outFile.exists()) {
			outFile.mkdirs();
		}

		ZipFile zipFile = new ZipFile(zipFilename);
		Enumeration en = zipFile.getEntries();
		ZipEntry zipEntry = null;
		while (en.hasMoreElements()) {
			zipEntry = (ZipEntry) en.nextElement();
			if (zipEntry.isDirectory()) {
				// 创建目录
				String dirName = zipEntry.getName();
				dirName = dirName.substring(0, dirName.length() - 1);
				File f = new File(outFile.getPath() + File.separator + dirName);
				f.mkdirs();
			} else {
				// 解压文件
				String strFilePath = outFile.getPath() + File.separator
						+ zipEntry.getName();
				File f = new File(strFilePath);

				// 如果文件不存在,就创建该文件所在文件夹的目录
				if (!f.exists()) {
					String[] arrFolderName = zipEntry.getName().split("/");
					String strRealFolder = "";
					for (int i = 0; i < (arrFolderName.length - 1); i++) {
						strRealFolder += arrFolderName[i] + File.separator;
					}
					strRealFolder = outFile.getPath() + File.separator
							+ strRealFolder;
					File tempDir = new File(strRealFolder);
					// 此处使用mkdirs()方法,不能用mkdir()
					tempDir.mkdirs();
				}
				f.createNewFile();
				InputStream in = zipFile.getInputStream(zipEntry);
				FileOutputStream out = new FileOutputStream(f);
				try {
					int length;
					byte[] buffer = new byte[BUFFER_SIZE];
					while ((length = in.read(buffer)) != -1) {
						out.write(buffer, 0, length);
					}
				} catch (IOException e) {
					throw e;
				} finally {
					out.close();
					in.close();
				}
			}
		}
	}

	public static void main(String[] args) {
		CompressFile bean = new CompressFile();
		try {
			boolean isZip = true;
			if (isZip) {
				bean.zip("D:\\Download", "d:/test_rar.zip");
			} else {
				bean.unzip("d:/test_rar.zip", "D:/Temp");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}