用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"); } } 在那里,有我们特有的记忆,亲情之忆、

用Java实现zip压缩文件和目录程序代码(二)

相关文章:

你感兴趣的文章:

标签云: