- /**
- *2007-12-26
- */
- 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 java.util.Enumeration;
- import org.apache.tools.zip.ZipEntry;
- import org.apache.tools.zip.ZipFile;
- import org.apache.tools.zip.ZipOutputStream;
- /**
- * ZIP文件压缩和解压(要使用apache ant.jar以处理中文乱码)
- *
- * @author sunjun
- * @version 2.0
- */
- public class ZipUtil {
- /**
- * 压缩文件file成zip文件zipFile
- *
- * @param file
- * 要压缩的文件
- * @param zipFile
- * 压缩文件存放地方
- * @throws Exception
- */
- public static void zip(File file, File zipFile) throws Exception {
- ZipOutputStream output = null;
- try {
- output = new ZipOutputStream(new FileOutputStream(zipFile));
- // 顶层目录开始
- zipFile(output, file, "");
- } catch (Exception ex) {
- ex.printStackTrace();
- } finally {
- // 关闭流
- if (output != null) {
- output.flush();
- output.close();
- }
- }
- }
- /**
- * 压缩文件为zip格式
- *
- * @param output
- * ZipOutputStream对象
- * @param file
- * 要压缩的文件或文件夹
- * @param basePath
- * 条目根目录
- * @throws IOException
- */
- private static void zipFile(ZipOutputStream output, File file,
- String basePath) throws IOException {
- FileInputStream input = null;
- try {
- // 文件为目录
- if (file.isDirectory()) {
- // 得到当前目录里面的文件列表
- File list[] = file.listFiles();
- basePath = basePath + (basePath.length() == 0 ? "" : "/")
- + file.getName();
- // 循环递归压缩每个文件
- for (File f : list)
- zipFile(output, f, basePath);
- } else {
- // 压缩文件
- basePath = (basePath.length() == 0 ? "" : basePath + "/")
- + file.getName();
- // System.out.println(basePath);
- output.putNextEntry(new ZipEntry(basePath));
- input = new FileInputStream(file);
- int readLen = 0;
- byte[] buffer = new byte[1024 * 8];
- while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)
- output.write(buffer, 0, readLen);
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- } finally {
- // 关闭流
- if (input != null)
- input.close();
- }
- }
- /**
- * 解压zip文件
- *
- * @param zipFilePath
- * zip文件绝对路径
- * @param unzipDirectory
- * 解压到的目录
- * @throws Exception
- */
- public static void unzip(String zipFilePath, String unzipDirectory)
- throws Exception {
- // 定义输入输出流对象
- InputStream input = null;
- OutputStream output = null;
- try {
- // 创建文件对象
- File file = new File(zipFilePath);
- // 创建zip文件对象
- ZipFile zipFile = new ZipFile(file);
- // 创建本zip文件解压目录
- String name = file.getName().substring(0,
- file.getName().lastIndexOf("."));
- File unzipFile = new File(unzipDirectory + "/" + name);
- if (unzipFile.exists())
- unzipFile.delete();
- unzipFile.mkdir();
- // 得到zip文件条目枚举对象
- Enumeration zipEnum = zipFile.getEntries();
- // 定义对象
- ZipEntry entry = null;
- String entryName = null, path = null;
- String names[] = null;
- int length;
- // 循环读取条目
- while (zipEnum.hasMoreElements()) {
- // 得到当前条目
- entry = (ZipEntry) zipEnum.nextElement();
- entryName = new String(entry.getName());
- // 用/分隔条目名称
- names = entryName.split("\\\\/");
- length = names.length;
- path = unzipFile.getAbsolutePath();
- for (int v = 0; v < length; v++) {
- if (v < length - 1) // 最后一个目录之前的目录
- FileUtil.createDirectory(path += "/" + names[v] + "/");
- else { // 最后一个
- if (entryName.endsWith("/")) // 为目录,则创建文件夹
- FileUtil.createDirectory(unzipFile
- .getAbsolutePath()
- + "/" + entryName);
- else { // 为文件,则输出到文件
- input = zipFile.getInputStream(entry);
- output = new FileOutputStream(new File(unzipFile
- .getAbsolutePath()
- + "/" + entryName));
- byte[] buffer = new byte[1024 * 8];
- int readLen = 0;
- while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)
- output.write(buffer, 0, readLen);
- }
- }
- }
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- } finally {
- // 关闭流
- if (input != null)
- input.close();
- if (output != null) {
- output.flush();
- output.close();
- }
- }
- }
- /**
- * 测试
- *
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- unzip("d:/桌面.zip", "f:/");
- System.out.println("over....................");
- zip(new File("C:/a"), new File("d:/桌面.zip"));
- System.out.println("over..............");
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/100420132802.html
来源: http://www.codesnippet.cn/detail/100420132802.html