Java 压缩文件

package com;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

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

public class ZipCompressor {
 static final int BUFFER = 8192;

 private File zipFile;

 public ZipCompressor(String pathName) {
  zipFile = new File(pathName);
 }

 public void compress(String srcPathName) {
  File file = new File(srcPathName);
  if (!file.exists())
   throw new RuntimeException(srcPathName + "不存在!");
  try {
   FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
   CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());
   ZipOutputStream out = new ZipOutputStream(cos);
   String basedir = "";
   compress(file, out, basedir);
   out.close();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }

 private void compress(File file, ZipOutputStream out, String basedir) {
  /* 判断是目录还是文件 */
  if (file.isDirectory()) {
   System.out.println("压缩:" + basedir + file.getName());
   this.compressDirectory(file, out, basedir);
  } else {
   System.out.println("压缩:" + basedir + file.getName());
   this.compressFile(file, out, basedir);
  }
 }

 /** 压缩一个目录 */
 private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
  if (!dir.exists())
   return;

  File[] files = dir.listFiles();
  for (int i = 0; i < files.length; i++) {
   /* 递归 */
   compress(files[i], out, basedir + dir.getName() + "/");
  }
 }

 /** 压缩一个文件 */
 private void compressFile(File file, ZipOutputStream out, String basedir) {
  if (!file.exists()) {
   return;
  }
  try {
   BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
   ZipEntry entry = new ZipEntry(basedir + file.getName());
   out.putNextEntry(entry);
   int count;
   byte data[] = new byte[BUFFER];
   while ((count = bis.read(data, 0, BUFFER)) != -1) {
    out.write(data, 0, count);
   }
   bis.close();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

//-------------------------------------------------------------------------------------------------------------

下面是测试

package com;

import java.io.File;
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;

public class Test {

 public static void main(String[] args) {
  // 1-----------------------------------------------------建立压缩文件
  // 将f:/code 目录压缩到f:/test.zip 文件中
  ZipCompressor zc = new ZipCompressor("f:/中国人.zip");
  zc.compress("f:/code");

  // 2-----------------------------------------------------解压缩文件
  FileOutputStream fileOut;
  File file;
  InputStream inputStream;
  try {
   // 要解压的文件 f:/中国人.zip
   ZipFile zipFile = new ZipFile("f:/中国人.zip");

   // 解压到指定目录下f:/ 自建立相关的code目录
   String path = "f:/";
   for (Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();) {
    ZipEntry entry = (ZipEntry) entries.nextElement();
    file = new File(path + entry.getName());
    if (entry.isDirectory()) {
     file.mkdirs();
    } else {
     // 如果指定文件的目录不存在,则创建之.
     File parent = file.getParentFile();
     if (!parent.exists()) {
      parent.mkdirs();
     }

     inputStream = zipFile.getInputStream(entry);
     int readedBytes = 0;
     byte[] buf = new byte[1024];
     fileOut = new FileOutputStream(file);
     while ((readedBytes = inputStream.read(buf)) > 0) {
      fileOut.write(buf, 0, readedBytes);
     }
     fileOut.close();

     inputStream.close();
    }
   }
   zipFile.close();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  }
 }
}

 

posted @ 2014-10-20 17:01  Sunny森  阅读(149)  评论(0编辑  收藏  举报