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

24 篇文章 0 订阅
  • 功能: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.*;

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

 

[java]  view plain copy
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3. /** 
  4. *@author Winty  
  5. *@Usage:  
  6. *   压缩:java Zip -zip "directoryName"  
  7. *   解压:java Zip -unzip "fileName.zip"  
  8. */   
  9. public class Zip{   
  10.     private ZipInputStream  zipIn;      //解压Zip   
  11.     private ZipOutputStream zipOut;     //压缩Zip   
  12.     private ZipEntry        zipEntry;   
  13.     private static int      bufSize;    //size of bytes   
  14.     private byte[]          buf;   
  15.     private int             readedBytes;   
  16.        
  17.     public Zip(){   
  18.         this(512);   
  19.     }   
  20.     public Zip(int bufSize){   
  21.         this.bufSize = bufSize;   
  22.         this.buf = new byte[this.bufSize];   
  23.     }   
  24.        
  25.     //压缩文件夹内的文件   
  26.     public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名   
  27.         File file;   
  28.         File zipDir;   
  29.         zipDir = new File(zipDirectory);   
  30.         String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名   
  31.         try{   
  32.             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));   
  33.             handleDir(zipDir , this.zipOut);   
  34.             this.zipOut.close();   
  35.         }catch(IOException ioe){   
  36.             ioe.printStackTrace();   
  37.         }   
  38.     }   
  39.     //由doZip调用,递归完成目录文件读取   
  40.     private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{   
  41.         FileInputStream fileIn;   
  42.         File[] files;   
  43.         files = dir.listFiles();   
  44.        
  45.         if(files.length == 0){//如果目录为空,则单独创建之.   
  46.             //ZipEntry的isDirectory()方法中,目录以"/"结尾.   
  47.             this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));   
  48.             this.zipOut.closeEntry();   
  49.         }   
  50.         else{//如果目录不为空,则分别处理目录和文件.   
  51.             for(File fileName : files){   
  52.                 //System.out.println(fileName);   
  53.                 if(fileName.isDirectory()){   
  54.                     handleDir(fileName , this.zipOut);   
  55.                 }   
  56.                 else{   
  57.                     fileIn = new FileInputStream(fileName);   
  58.                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));   
  59.                     while((this.readedBytes = fileIn.read(this.buf))>0){   
  60.                         this.zipOut.write(this.buf , 0 , this.readedBytes);   
  61.                     }   
  62.                     this.zipOut.closeEntry();   
  63.                 }   
  64.             }   
  65.         }   
  66.     }   
  67.     //解压指定zip文件   
  68.     public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名   
  69.         FileOutputStream fileOut;   
  70.         File file;   
  71.         try{   
  72.             this.zipIn = new ZipInputStream (new BufferedInputStream(new FileInputStream(unZipfileName)));   
  73.             while((this.zipEntry = this.zipIn.getNextEntry()) != null){   
  74.                 file = new File(this.zipEntry.getName());   
  75.                 //System.out.println(file);///   
  76.                 if(this.zipEntry.isDirectory()){   
  77.                     file.mkdirs();   
  78.                 }   
  79.                 else{   
  80.                     //如果指定文件的目录不存在,则创建之.   
  81.                     File parent = file.getParentFile();   
  82.                     if(!parent.exists()){   
  83.                         parent.mkdirs();   
  84.                     }   
  85.                     fileOut = new FileOutputStream(file);   
  86.                     while(( this.readedBytes = this.zipIn.read(this.buf) ) > 0){   
  87.                         fileOut.write(this.buf , 0 , this.readedBytes );   
  88.                     }   
  89.                     fileOut.close();   
  90.                 }   
  91.                 this.zipIn.closeEntry();       
  92.             }   
  93.         }catch(IOException ioe){   
  94.             ioe.printStackTrace();   
  95.         }   
  96.     }   
  97.     //设置缓冲区大小   
  98.     public void setBufSize(int bufSize){   
  99.         this.bufSize = bufSize;   
  100.     }   
  101.     //测试Zip类   
  102.     public static void main(String[] args)throws Exception{   
  103.         if(args.length==2){   
  104.             String name = args[1];   
  105.             Zip zip = new Zip();   
  106.             if(args[0].equals("-zip"))   
  107.                 zip.doZip(name);   
  108.             else if(args[0].equals("-unzip"))   
  109.                 zip.unZip(name);   
  110.         }   
  111.         else{   
  112.             System.out.println("Usage:");   
  113.             System.out.println("压缩:java Zip -zip http://www.bt285.cn /directoryName");   
  114.             System.out.println("解压:java Zip -unzip http://www.feng123.com /fileName.zip");   
  115.             throw new Exception("Arguments error!");   
  116.         }   
  117.     }   
  118. }  

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了ZipOutputStream类和ZipInputStream类,用于压缩解压缩文件压缩文件: ```java import java.io.*; import java.util.zip.*; public class ZipFile { public static void main(String[] args) throws Exception { // 创建压缩文件输出流 FileOutputStream fos = new FileOutputStream("test.zip"); ZipOutputStream zos = new ZipOutputStream(fos); // 创建要压缩文件输入流 FileInputStream fis = new FileInputStream("test.txt"); BufferedInputStream bis = new BufferedInputStream(fis); // 开始写入压缩文件 zos.putNextEntry(new ZipEntry("test.txt")); int len; byte[] buffer = new byte[1024]; while ((len = bis.read(buffer)) > 0) { zos.write(buffer, 0, len); } // 关闭流 bis.close(); zos.closeEntry(); zos.close(); fos.close(); } } ``` 解压文件: ```java import java.io.*; import java.util.zip.*; public class UnzipFile { public static void main(String[] args) throws Exception { // 创建压缩文件输入流 FileInputStream fis = new FileInputStream("test.zip"); ZipInputStream zis = new ZipInputStream(fis); // 开始解压缩文件 ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) { String fileName = zipEntry.getName(); File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); int len; byte[] buffer = new byte[1024]; while ((len = zis.read(buffer)) > 0) { bos.write(buffer, 0, len); } // 关闭流 bos.close(); fos.close(); zipEntry = zis.getNextEntry(); } // 关闭流 zis.closeEntry(); zis.close(); fis.close(); } } ``` 以上是基本的压缩解压缩文件实现方法,也可以使用更高级的类库,如Apache Commons Compress。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值