隨筆 - 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 小一敗涂地 閱讀(1814) 評論(0)  編輯  收藏 所屬分類: java語言相關

          主站蜘蛛池模板: 永胜县| 通江县| 左贡县| 凤城市| 绥江县| 六安市| 大埔县| 乌拉特后旗| 庄河市| 太和县| 大渡口区| 澄城县| 涪陵区| 花垣县| 锦州市| 罗城| 中西区| 永平县| 岳西县| 馆陶县| 舞钢市| 东宁县| 抚宁县| 鹰潭市| 门源| 玉环县| 区。| 德清县| 定结县| 科技| 莆田市| 龙门县| 揭阳市| 东兰县| 昭通市| 清新县| 衡南县| 泌阳县| 溆浦县| 灯塔市| 石林|