Java 解压缩

java.util.zip包实现了zip格式相关的类库,使用ZIP格式压缩和解压缩文件时可以使用该包中的类,但是对于解压缩中文文件名,就会出现乱码,所以可以使用ant中的org.apache.tools.zip包中的类进行解压缩,使用方法和java中的类似

使用ZipoOutputStream可以实现文件压缩,所有写入到ZipOutputStream输出流中的数据,都会被Zip格式压缩。

每个压缩的文件或目录在ZIP文件中对应一个ZipEntry对象,每个ZipEntry都有一个name属性,表示它相对于Zip文件根目录的相对路径,对于目录,路径以‘/’结束,对应文件,路径以文件名结尾。

ZipOutputStream的putNextEntry方法忘Zip文件中添加一个ZipEntry,紧接着写入到该ZipOutputStream流中的数据都被保存在这个ZipEntry中,直到调用ZipOutputStream的closeEntry方法。

ZipFile表示一个Zip文件,它的entries方法能获取Zip文件中所有的ZipEntry集合。

ZipEntry的isDirectory方法判断该ZipEntry是否代表一个目录。getInputStream方法获取ZipEntry的输入流


[java]  view plain copy
  1. package com.lkt.zip;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.util.Enumeration;  
  8.   
  9. import org.apache.tools.zip.ZipEntry;  
  10. import org.apache.tools.zip.ZipFile;  
  11. import org.apache.tools.zip.ZipOutputStream;  
  12.   
  13. /** 
  14.  * Zip压缩和解压文件或目录 
  15.  * @author Administrator 
  16.  * 
  17.  */  
  18. public class ZipTest {  
  19.       
  20.     public static void zipFile(String baseDirName,String fileName,String targetFileName){  
  21.         if(baseDirName==null){  
  22.             System.out.println("压缩失败,根目录不存在:"+baseDirName);  
  23.             return ;  
  24.         }  
  25.         File baseDir=new File(baseDirName);  
  26.         if(!baseDir.exists()||(!baseDir.isDirectory())){  
  27.             System.out.println("压缩失败,根目录不存在:"+baseDirName);  
  28.             return ;  
  29.         }  
  30.         String baseDirPath=baseDir.getPath();  
  31.         System.out.println(baseDirPath);  
  32.         //目标文件  
  33.         File targetFile=new File(targetFileName);  
  34.         try {  
  35.             //创建一个zip输出流来压缩数据并写入到zip文件  
  36.             ZipOutputStream out=new ZipOutputStream(new FileOutputStream(targetFile));  
  37.             if(fileName.equals("*")){  
  38.                 dirToZip(baseDirPath, baseDir, out);  
  39.             }else{  
  40.                 File file=new File(baseDir,fileName);  
  41.                 if(file.isFile()){  
  42.                     fileToZip(baseDirPath, file, out);  
  43.                 }else{  
  44.                     dirToZip(baseDirPath, file, out);  
  45.                 }  
  46.             }  
  47.             out.close();  
  48.             System.out.println("压缩文件成功,目标文件名:"+targetFileName);  
  49.         } catch (Exception e) {  
  50.             // TODO: handle exception  
  51.         }  
  52.     }  
  53.     /** 
  54.      * 解压ZIP文件,将ZIP文件的内容解压到targetDir目录下 
  55.      * @param zipFileName 
  56.      * @param targetBaseDirName 
  57.      */  
  58.     public static void upzipFile(String zipFileName,String targetBaseDirName){  
  59.         if(!targetBaseDirName.endsWith(File.separator)){  
  60.             targetBaseDirName+=File.separator;  
  61.         }  
  62.         try {  
  63.             //根据ZIP文件创建zipfile对象  
  64.             ZipFile zipFile=new ZipFile(zipFileName);  
  65.             ZipEntry entry=null;  
  66.             String entryName=null;  
  67.             String targetFileName=null;  
  68.             byte[] buffer=new byte[4096];  
  69.             int bytes_read;  
  70.             //获取ZIP文件里所有的entry  
  71.             Enumeration entrys=zipFile.getEntries();  
  72.             while(entrys.hasMoreElements()){  
  73.                 entry=(ZipEntry)entrys.nextElement();  
  74.                 entryName=entry.getName();  
  75.                 targetFileName=targetBaseDirName+entryName;  
  76.                 if(entry.isDirectory()){  
  77.                     new File(targetFileName).mkdirs();  
  78.                     continue;  
  79.                 }else{  
  80.                     new File(targetFileName).getParentFile().mkdirs();  
  81.                 }  
  82.                 File targetFile=new File(targetFileName);  
  83.                 System.out.println("创建文件:"+targetFile.getAbsolutePath());  
  84.                 FileOutputStream os=new FileOutputStream(targetFile);  
  85.                 InputStream is=zipFile.getInputStream(entry);  
  86.                 while((bytes_read=is.read(buffer))!=-1){  
  87.                     os.write(buffer, 0, bytes_read);  
  88.                 }  
  89.                 os.close();  
  90.                 is.close();  
  91.             }  
  92.             System.out.println("解压缩文件成功");  
  93.         } catch (Exception e) {  
  94.             System.out.println("解压缩文件失败");  
  95.         }  
  96.     }  
  97.       
  98.     /** 
  99.      * 将目录压缩到ZIP输出流 
  100.      * @param baseDirPath 
  101.      * @param dir 
  102.      * @param out 
  103.      */  
  104.     private static void dirToZip(String baseDirPath,File dir,ZipOutputStream out){  
  105.         if(dir.isDirectory()){  
  106.             File[] files=dir.listFiles();  
  107.             if(files.length==0){  
  108.                 ZipEntry entry=new ZipEntry(getEntryName(baseDirPath, dir));  
  109.                 try {  
  110.                     out.putNextEntry(entry);  
  111.                     out.closeEntry();  
  112.                 } catch (Exception e) {  
  113.                 }  
  114.                 return ;  
  115.             }  
  116.             for (int i = 0; i < files.length; i++) {  
  117.                 if(files[i].isFile()){  
  118.                     fileToZip(baseDirPath, files[i], out);  
  119.                 }else{  
  120.                     dirToZip(baseDirPath, files[i], out);  
  121.                 }  
  122.             }  
  123.         }  
  124.     }  
  125.       
  126.       
  127.     //将文件压缩到ZIP输出流  
  128.     private static void fileToZip(String baseDirPath,File file,ZipOutputStream out){  
  129.         FileInputStream in=null;  
  130.         ZipEntry entry=null;  
  131.         //创建复制缓冲区  
  132.         byte[] buffer=new byte[4096];  
  133.         int bytes_read;  
  134.         if(file.isFile()){  
  135.             try {  
  136.                 //创建一个文件输入流  
  137.                 in =new FileInputStream(file);  
  138.                 entry=new ZipEntry(getEntryName(baseDirPath, file));  
  139.                 //存储项信息到压缩文件  
  140.                 out.putNextEntry(entry);  
  141.                 //复制字节到压缩文件  
  142.                 while((bytes_read=in.read(buffer))!=-1){  
  143.                     out.write(buffer, 0, bytes_read);  
  144.                 }  
  145.                 out.closeEntry();  
  146.                 in.close();  
  147.                 System.out.println("添加文件:"+file.getAbsolutePath()+"被添加到ZIP文件中");  
  148.             } catch (Exception e) {  
  149.                 e.printStackTrace();  
  150.             }  
  151.         }  
  152.     }  
  153.       
  154.     //获取待压缩文件在ZIP文件中的entry的名字,即相对于根目录的相对路径名  
  155.     private static String getEntryName(String baseDirPath,File file){  
  156.         if(!baseDirPath.endsWith(File.separator)){  
  157.             baseDirPath+=File.separator;  
  158.         }  
  159.         String filePath=file.getAbsolutePath();  
  160.         if(file.isDirectory()){  
  161.             filePath+="/";  
  162.         }  
  163.         int index=filePath.indexOf(baseDirPath);  
  164.         return filePath.substring(index+baseDirPath.length());  
  165.     }  
  166.       
  167.       
  168.     public static void main(String[] args) {  
  169.         String baseDirName="E:";  
  170.         String fileName="工作图片/";  
  171.         String zipFileName="E:\\工作图片.zip";  
  172.         ZipTest.zipFile(baseDirName, fileName, zipFileName);  
  173.         //ZipTest.upzipFile("F:\\学习资料\\Python\\hibernate-release-4.2.4.Final.zip", "F:\\学习资料\\Python\\hibernate4.2.4");  
  174.     }  
  175.       
  176.       
  177. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值