java解压缩.gz .zip .tar.gz等格式的压缩包方法总结
Posted haoyul
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解压缩.gz .zip .tar.gz等格式的压缩包方法总结相关的知识,希望对你有一定的参考价值。
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) charset 12 //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;
以上是关于java解压缩.gz .zip .tar.gz等格式的压缩包方法总结的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?
Ubuntu解压缩zip,tar,tar.gz,tar.bz2
Ubuntu解压缩zip,tar,tar.gz,tar.bz2