(java 基础知识) Zip解压与压缩(java.util.zip)

来源:互联网 发布:匡恩网络 刘晓庆 编辑:程序博客网 时间:2024/06/01 07:20

下面的分别是写和读zip文件,其中写是递归的,功能完备了。读只是读根目录的,缺少递归。

而且没有涉及中文问题:

 

[c-sharp] view plaincopyprint?
  1. import java.io.*;  
  2. import java.util.zip.*;  
  3.   
  4. public class Zip {  
  5.     static final int BUFFER = 2048;   
  6.     static boolean flag = false;  
  7.       
  8.     public static void main(String args[])throws IOException{  
  9.         File file= new File("D:/Temp");  
  10.         ZipSubdirectory(file);  
  11.         FileInputStream file1 = new FileInputStream(ZipSubdirectory(file));  
  12.         System.out.println(file1.toString());  
  13.     }  
  14.     //ZipSubdirectory函数将一个指定目录(包括它子目录)压缩成一个同名压缩文件(这里称为"ORIGIN")  
  15.     public static File ZipSubdirectory(File myDir)throws IOException{  
  16.         //创建缓冲输入流BufferedInputStream    
  17.         BufferedInputStream origin = null;  
  18.         //创建ZipOutputStream对象,将向它传递希望写入文件的输出流  
  19.         File zipFile=new File("D:/"+myDir.getName()+".zip");  
  20.         FileOutputStream fos=new FileOutputStream(zipFile);  
  21.         ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(fos,BUFFER));  
  22.         //dirContents[]获取当前目录(myDir)所有文件对象(包括子目录名)  
  23.         File dirContents[]=myDir.listFiles();  
  24.         //创建临时文件tempFile,使用后删除   
  25.         File tempFile=null;   
  26.         try{  
  27.             //处理当前目录所有文件对象,包括子目录  
  28.             for(int i=0;i < dirContents.length; i++){  
  29.             //使用递归方法将当前目录的子目录转成一个ZIP文件,并作为一个ENTRY加进"ORIGIN"   
  30.             if(dirContents[i].isDirectory()){  
  31.                 tempFile = ZipSubdirectory(dirContents[i]);  
  32.                 flag=true;  
  33.         }  
  34.         //如果当前文件不是子目录   
  35.         else {  
  36.             tempFile=dirContents[i];  
  37.             //flag标记tempFile是否由子目录压缩成的ZIP文件  
  38.             flag = false;  
  39.         }  
  40.         System.out.println("Compress file: "+tempFile.getName());  
  41.         FileInputStream fis = new FileInputStream(tempFile);  
  42.         origin = new BufferedInputStream(fis,BUFFER);  
  43.         //为被读取的文件创建压缩条目   
  44.         ZipEntry entry = new ZipEntry(tempFile.getName());  
  45.         byte data[]= new byte[BUFFER];  
  46.         int count;  
  47.         //在向ZIP输出流写入数据之前,必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象   
  48.         out.putNextEntry(entry);  
  49.         //向ZIP 文件写入数据    
  50.         while((count=origin.read(data,0,BUFFER))!=-1){  
  51.             out.write(data,0,count);  
  52.         }  
  53.         //tempFile是临时生成的ZIP文件,删除它  
  54.         if(flag==true){  
  55.             flag = tempFile.delete();  
  56.             System.out.println("Delete file:"+tempFile.getName()+flag);   
  57.         }   
  58.         //关闭输入流    
  59.         origin.close();   
  60.         }  
  61.         out.close();  
  62.         } catch(Exception e){  
  63.             System.out.println(e);  
  64.         }  
  65.         //递归返回    
  66.         return zipFile;   
  67.     }  
  68. }  

 

 

[c-sharp] view plaincopyprint?
  1. import java.io.BufferedInputStream;  
  2. import java.io.BufferedOutputStream;  
  3.   
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6.   
  7. import java.util.zip.ZipEntry;  
  8. import java.util.zip.ZipInputStream;  
  9. import java.util.zip.ZipOutputStream;  
  10.   
  11. public class Test {  
  12.   
  13.   
  14.     public static void main(String[] args) {  
  15.         readFileAndWriteZip();  
  16.         unZipFile();  
  17.     }  
  18.   
  19.     public static void unZipFile() {  
  20.     try{  
  21.         int BUFFER = 1024;  
  22.         BufferedOutputStream dest = null;  
  23.         FileInputStream fis = new FileInputStream("D:/Temp.zip");  
  24.         ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));  
  25.         ZipEntry entry;  
  26.         while ((entry = zis.getNextEntry()) != null) {  
  27.             System.out.println("Extracting: " + entry);  
  28.             int count;  
  29.             byte data[] = new byte[1024];  
  30.             FileOutputStream fos = new  FileOutputStream("D:/"+entry.getName());  
  31.             dest = new BufferedOutputStream(fos, BUFFER);  
  32.             while ((count = zis.read(data, 0, BUFFER)) != -1) {  
  33.                 dest.write(data, 0, count);  
  34.             }  
  35.             dest.flush();  
  36.             dest.close();  
  37.         }  
  38.         zis.close();  
  39.     } catch (Exception e) {  
  40.         e.printStackTrace();  
  41.     }  
  42.   
  43.     }  
  44.   
  45.     public static void readFileAndWriteZip() {  
  46.   
  47.         try {  
  48.                
  49.         } catch (Exception ex){  
  50.             System.err.println(ex.toString());  
  51.         }  
  52.     }  
  53.   
  54.        
  55.   
  56. }  

 

测试通过的。