六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

使用java.util.zip实现zip压缩和解压

[复制链接]

升级  98%

13

主题

13

主题

13

主题

童生

Rank: 1

积分
49
 楼主| 发表于 2013-2-3 13:33:55 | 显示全部楼层 |阅读模式
转载:http://wintys.blog.51cto.com/425414/90872
import java.io.*; import java.util.zip.*; /** *功能:zip压缩、解压 *说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能. *问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时, *     就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  *               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285) *解决: *  方法1、修改import java.util.zip.ZipInputStream和ZipOutputStream. *          java.util.zip只支持UTF-8,Ant里面可以指定编码. *  方法2、使用Apache Ant里提供的zip工具。 *          不使用java.util.zip的包,把ant.jar放到classpath中. *          程序中使用import org.apache.tools.zip.*; * *仅供编程学习参考. * *@author Winty *@date   2008-8-3 *@Usage: *   压缩:java Zip -zip "directoryName" *   解压:java Zip -unzip "fileName.zip" */ public class Zip{     private ZipInputStream  zipIn;      //解压Zip     private ZipOutputStream zipOut;     //压缩Zip     private ZipEntry        zipEntry;     private static int      bufSize;    //size of bytes     private byte[]          buf;     private int             readedBytes;          public Zip(){         this(512);     }     public Zip(int bufSize){         this.bufSize = bufSize;         this.buf = new byte[this.bufSize];     }          //压缩文件夹内的文件     public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名         File file;         File zipDir;         zipDir = new File(zipDirectory);         String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名         try{             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));             handleDir(zipDir , this.zipOut);             this.zipOut.close();         }catch(IOException ioe){             ioe.printStackTrace();         }     }     //由doZip调用,递归完成目录文件读取     private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{         FileInputStream fileIn;         File[] files;         files = dir.listFiles();              if(files.length == 0){//如果目录为空,则单独创建之.             //ZipEntry的isDirectory()方法中,目录以"/"结尾.             this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));             this.zipOut.closeEntry();         }         else{//如果目录不为空,则分别处理目录和文件.             for(File fileName : files){                 //System.out.println(fileName);                 if(fileName.isDirectory()){                     handleDir(fileName , this.zipOut);                 }                 else{                     fileIn = new FileInputStream(fileName);                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));                     while((this.readedBytes = fileIn.read(this.buf))>0){                         this.zipOut.write(this.buf , 0 , this.readedBytes);                     }                     this.zipOut.closeEntry();                 }             }         }     }     //解压指定zip文件     public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名         FileOutputStream fileOut;         File file;         try{             this.zipIn = new ZipInputStream (new BufferedInputStream(new FileInputStream(unZipfileName)));             while((this.zipEntry = this.zipIn.getNextEntry()) != null){                 file = new File(this.zipEntry.getName());                 //System.out.println(file);///                 if(this.zipEntry.isDirectory()){                     file.mkdirs();                 }                 else{                     //如果指定文件的目录不存在,则创建之.                     File parent = file.getParentFile();                     if(!parent.exists()){                         parent.mkdirs();                     }                     fileOut = new FileOutputStream(file);                     while(( this.readedBytes = this.zipIn.read(this.buf) ) > 0){                         fileOut.write(this.buf , 0 , this.readedBytes );                     }                     fileOut.close();                 }                 this.zipIn.closeEntry();                 }         }catch(IOException ioe){             ioe.printStackTrace();         }     }     //设置缓冲区大小     public void setBufSize(int bufSize){         this.bufSize = bufSize;     }     //测试Zip类     public static void main(String[] args)throws Exception{         if(args.length==2){             String name = args[1];             Zip zip = new Zip();             if(args[0].equals("-zip"))                 zip.doZip(name);             else if(args[0].equals("-unzip"))                 zip.unZip(name);         }         else{             System.out.println("Usage:");             System.out.println("压缩:java Zip -zip directoryName");             System.out.println("解压:java Zip -unzip fileName.zip");             throw new Exception("Arguments error!");         }     } }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表