隨筆 - 0, 文章 - 264, 評論 - 170, 引用 - 0
          數據加載中……

          用Java實現ZIP壓縮文件和目錄程序代碼(注:轉載于http://www.javaweb.cc/language/java/222365.shtml)

          用Java實現zip壓縮文件和目錄程序代碼

          今天寫了個用java壓縮的功能,可以實現對文件和目錄的壓縮。

          由于java.util.zip.ZipOutputStream有中文亂碼問題,所以采用org.apache.tools.zip.ZipOutputStream。
          以下是代碼:
          Java代碼
          package net.szh.zip;

          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 net.szh.zip;

          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);
          }
          }
          }

          后來發現原來可以用ant中的org.apache.tools.ant.taskdefs.Zip來實現,更加簡單。
          Java代碼
          package net.szh.zip;

          import java.io.File;

          import org.apache.tools.ant.Project;
          import org.apache.tools.ant.taskdefs.Zip;
          import org.apache.tools.ant.types.FileSet;

          public class ZipCompressorByAnt {

          private File zipFile;

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

          public void compress(String srcPathName) {
          File srcdir = new File(srcPathName);
          if (!srcdir.exists())
          throw new RuntimeException(srcPathName + "不存在!");

          Project prj = new Project();
          Zip zip = new Zip();
          zip.setProject(prj);
          zip.setDestFile(zipFile);
          FileSet fileSet = new FileSet();
          fileSet.setProject(prj);
          fileSet.setDir(srcdir);
          //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java");
          //fileSet.setExcludes(...); 排除哪些文件或文件夾
          zip.addFileset(fileSet);

          zip.execute();
          }
          }

          package net.szh.zip;

          import java.io.File;

          import org.apache.tools.ant.Project;
          import org.apache.tools.ant.taskdefs.Zip;
          import org.apache.tools.ant.types.FileSet;

          public class ZipCompressorByAnt {

          private File zipFile;

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

          public void compress(String srcPathName) {
          File srcdir = new File(srcPathName);
          if (!srcdir.exists())
          throw new RuntimeException(srcPathName + "不存在!");

          Project prj = new Project();
          Zip zip = new Zip();
          zip.setProject(prj);
          zip.setDestFile(zipFile);
          FileSet fileSet = new FileSet();
          fileSet.setProject(prj);
          fileSet.setDir(srcdir);
          //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java");
          //fileSet.setExcludes(...); 排除哪些文件或文件夾
          zip.addFileset(fileSet);

          zip.execute();
          }
          }
          測試一下
          Java代碼
          package net.szh.zip;

          public class TestZip {
          public static void main(String[] args) {
          ZipCompressor zc = new ZipCompressor("E:""szhzip.zip");
          zc.compress("E:""test");

          ZipCompressorByAnt zca = new ZipCompressorByAnt("E:""szhzipant.zip");
          zca.compress("E:""test");
          }
          }
           


          posted on 2010-12-06 17:13 小一敗涂地 閱讀(1819) 評論(0)  編輯  收藏 所屬分類: java語言相關

          主站蜘蛛池模板: 乐山市| 湖北省| 达孜县| 马尔康县| 阿瓦提县| 贵州省| 咸丰县| 伊吾县| 商丘市| 三穗县| 浑源县| 柘城县| 通海县| 措美县| 邯郸市| 门头沟区| 大石桥市| 山东省| 台江县| 宜良县| 东山县| 界首市| 和林格尔县| 广丰县| 敖汉旗| 寿阳县| 玉溪市| 焦作市| 绥芬河市| 玉田县| 陆河县| 石首市| 历史| 进贤县| 岳普湖县| 莱州市| 巧家县| 新河县| 长治县| 娄烦县| 深泽县|