使用Java实现文件的压缩和解压缩

        在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;

  功能:zip压缩、解压

  说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.

  问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentExceptionat java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)

  解决:

  方法1、修改importjava.util.zip.ZipInputStream和ZipOutputStream.java.util.zip只支持UTF-8,Ant里面可以指定编码.

  方法2、使用ApacheAnt里提供的zip工具。不使用java.util.zip的包,把ant.jar放到classpath中.

  程序中使用import org.apache.tools.zip.*;

  仅供编程学习参考.代码如下:

  [java] view plaincopy

  import java.io.*;

  import java.util.zip.*;

  /**

  *@author Winty

  *@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(StringzipDirectory){//zipDirectoryPath:需要压缩的文件夹名

  File file;

  File zipDir;

  zipDir = new File(zipDirectory);

  String zipFileName = zipDir.getName() +".zip";//压缩后生成的zip文件名

  try{

  this.zipOut = new ZipOutputStream(newBufferedOutputStream(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(newZipEntry(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(newZipEntry(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(StringunZipfileName){//unZipfileName需要解压的zip文件名

  FileOutputStream fileOut;

  File file;

  try{

  this.zipIn = new ZipInputStream (newBufferedInputStream(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 http://www.bt285.cn/directoryName");

  System.out.println("解压:java Zip -unzip http://www.feng123.com/fileName.zip");

  throw new Exception("Argumentserror!");

  }

  }

  }

疯狂Java培训的课程采用针对性培养,全面提升学员就业能力,重点加强训练职业素质。老师辛勤的讲解,让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让学员在半年的时间内掌握8-10万的代码量,成为真正的技术高手,疯狂Java采用企业全真模拟开发训练,迅速积累项目经验。让学员迅速获得其他人需要花费两年才能获得的工作技能,无忧就业!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值