用java实现zip压缩
本来是写到spaces live上的,可是代码的显示效果确实不怎么好看。在javaeye上试了试代码显示的顺眼多了。 
今天写了个用java压缩的功能,可以实现对文件和目录的压缩。
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
以下是代码:
后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
测试一下
今天写了个用java压缩的功能,可以实现对文件和目录的压缩。
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
以下是代码:
- 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来实现,更加简单。
- 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;
 - 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");
 - }
 - }
 
                    
                
                
            
        
浙公网安备 33010602011771号