java解压缩.gz .zip .tar.gz等格式的压缩包方法总结

来源:互联网 发布:gephi源码构建 编辑:程序博客网 时间:2024/05/22 01:59

1、.gz文件是linux下常见的压缩格式。使用 java.util.zip.GZIPInputStream即可,压缩是 java.util.zip.GZIPOutputStream

 

复制代码
 1     public static void unGzipFile(String sourcedir) { 2         String ouputfile = ""; 3         try {   4             //建立gzip压缩文件输入流  5             FileInputStream fin = new FileInputStream(sourcedir);    6             //建立gzip解压工作流 7             GZIPInputStream gzin = new GZIPInputStream(fin);    8             //建立解压文件输出流   9             ouputfile = sourcedir.substring(0,sourcedir.lastIndexOf('.'));10             ouputfile = ouputfile.substring(0,ouputfile.lastIndexOf('.'));11             FileOutputStream fout = new FileOutputStream(ouputfile);   12             13             int num;14             byte[] buf=new byte[1024];15 16             while ((num = gzin.read(buf,0,buf.length)) != -1)17             {   18                 fout.write(buf,0,num);   19             }20 21             gzin.close();   22             fout.close();   23             fin.close();   24         } catch (Exception ex){  25             System.err.println(ex.toString());  26         }  27         return;28     }  
复制代码

2、zip文件,使用java.util.zip.ZipEntry 和 java.util.zip.ZipFile

 

复制代码
 1 /**  2      * 解压缩zipFile  3      * @param file 要解压的zip文件对象  4      * @param outputDir 要解压到某个指定的目录下  5      * @throws IOException  6      */   7     public static void unZip(File file,String outputDir) throws IOException {      8         ZipFile zipFile = null;   9           10         try {  11             Charset CP866 = Charset.forName("CP866");  //specifying alternative (non UTF-8) charset12             //ZipFile zipFile = new ZipFile(zipArchive, CP866);13             zipFile =  new ZipFile(file, CP866);        14             createDirectory(outputDir,null);//创建输出目录  15   16             Enumeration<?> enums = zipFile.entries();  17             while(enums.hasMoreElements()){  18                   19                 ZipEntry entry = (ZipEntry) enums.nextElement();  20                 System.out.println("解压." +  entry.getName());  21                   22                 if(entry.isDirectory()){//是目录23                     createDirectory(outputDir,entry.getName());//创建空目录                24                 }else{//是文件      25                     File tmpFile = new File(outputDir + "/" + entry.getName());   26                     createDirectory(tmpFile.getParent() + "/",null);//创建输出目录  27                       28                     InputStream in = null;    29                     OutputStream out = null;  30                     try{  31                         in = zipFile.getInputStream(entry);;    32                         out = new FileOutputStream(tmpFile);  33                         int length = 0;  34                           35                         byte[] b = new byte[2048];   36                         while((length = in.read(b)) != -1){  37                             out.write(b, 0, length);  38                         }  39                       40                     }catch(IOException ex){  41                         throw ex;  42                     }finally{  43                         if(in!=null)  44                             in.close();  45                         if(out!=null)  46                             out.close();  47                     }      48                 }  49             }  50               51         } catch (IOException e) {  52             throw new IOException("解压缩文件出现异常",e);  53         } finally{  54             try{  55                 if(zipFile != null){  56                     zipFile.close();  57                 }  58             }catch(IOException ex){  59                 throw new IOException("关闭zipFile出现异常",ex);  60             }  61         }      62     }  63       64     /** 65      * 构建目录 66      * @param outputDir 67      * @param subDir 68      */  69     public static void createDirectory(String outputDir,String subDir){     70         File file = new File(outputDir);  71         if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空  72             file = new File(outputDir + "/" + subDir);  73         }  74         if(!file.exists()){  75               if(!file.getParentFile().exists())76                   file.getParentFile().mkdirs();77             file.mkdirs();  78         }  79     }  
复制代码

3、.tar.gz文件可以看做先用tar打包,再使用gz进行压缩。

使用org.apache.tools.tar.TarEntry;  org.apache.tools.tar.TarInputStream 和 org.apache.tools.tar.TarOutputStream

 

复制代码
 1  //------------------------------------------------------------------------------------------------------ 2     /**  3      * 解压tar.gz 文件  4      * @param file 要解压的tar.gz文件对象  5      * @param outputDir 要解压到某个指定的目录下  6      * @throws IOException  7      */   8     public static void unTarGz(File file,String outputDir) throws IOException{   9         TarInputStream tarIn = null;  10         try{  11             tarIn = new TarInputStream(new GZIPInputStream(  12                     new BufferedInputStream(new FileInputStream(file))),  13                     1024 * 2);  14               15             createDirectory(outputDir,null);//创建输出目录  16 17             TarEntry entry = null;  18             while( (entry = tarIn.getNextEntry()) != null ){  19                   20                 if(entry.isDirectory()){//是目录21                     entry.getName();22                     createDirectory(outputDir,entry.getName());//创建空目录  23                 }else{//是文件24                     File tmpFile = new File(outputDir + "/" + entry.getName());  25                     createDirectory(tmpFile.getParent() + "/",null);//创建输出目录  26                     OutputStream out = null;  27                     try{  28                         out = new FileOutputStream(tmpFile);  29                         int length = 0;  30                           31                         byte[] b = new byte[2048];  32                           33                         while((length = tarIn.read(b)) != -1){  34                             out.write(b, 0, length);  35                         }  36                       37                     }catch(IOException ex){  38                         throw ex;  39                     }finally{  40                           41                         if(out!=null)  42                             out.close();  43                     }  44                 }45             }  46         }catch(IOException ex){  47             throw new IOException("解压归档文件出现异常",ex);  48         } finally{  49             try{  50                 if(tarIn != null){  51                     tarIn.close();  52                 }  53             }catch(IOException ex){  54                 throw new IOException("关闭tarFile出现异常",ex);  55             }  56         }  57     }  
复制代码

 

使用到的包头有:

复制代码
 1 import java.io.BufferedInputStream; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8  9 import java.nio.charset.Charset;10 import java.util.Enumeration;11 import java.util.zip.GZIPInputStream;12 import java.util.zip.ZipEntry;13 import java.util.zip.ZipFile;14 15 import org.apache.tools.tar.TarEntry;  16 import org.apache.tools.tar.TarInputStream;  17 import org.apache.tools.tar.TarOutputStream;  
复制代码