最近做的项目中涉及到了对tar文件的解压,众所周知jdk中提供了对zip文件的操作,对tar文件并没有相关的api,这种情况下只能是依赖于第三方jar了。
我用的第三方jar包是javatar2.5,apache也有相关的api org.apache.tools.tar,网上有人说它是对javatar的封装,这个就不是我们关心的范围了,不过看过相关的文档后发现 使用方式确实很多地方是相同的(其实jdk中对zip文件的api使用也是这样)
我的想法很简单:以流的方式读入 以需要的格式写出
根据以上的想法我首先需要一个读tar文件的流,在javatar中有TarInputStream正好符合我的需求 第一步走出去了 以后就是一马平川了 呵呵 闲话不说 给出我的论证代码

mport java.io.File; 

import java.io.FileInputStream; 

import java.io.FileNotFoundException; 

import java.io.FileOutputStream; 

import java.io.IOException; 

import java.io.InputStream; 

import java.io.OutputStream; 

import com.ice.tar.TarEntry; 

import com.ice.tar.TarInputStream; 

import com.zephyr.inflater.service.InflaterManager; 


public class InflaterManagerImpl implements InflaterManager { 

 public void inflat(String path) { 

 InputStream inputstream = null; 

 OutputStream outputstream = null; 

 TarInputStream zis = null; 

 try { 

 File file = new File(path); 

 File tempFile = null; 

 inputstream = new FileInputStream(file); 

 zis = new TarInputStream(inputstream); 

 /*关键在于这个TarEntry 的理解, 

 实际你的tar包里有多少文件就有多 

 少TarEntry*/ 

 TarEntry tarEntry = null; 

 while ((tarEntry = zis.getNextEntry()) != null) { 

 tempFile = new File("d:\\sss\\" + tarEntry.getName()); 

 tempFile.createNewFile(); 

 outputstream = new FileOutputStream(tempFile); 

 //定一个缓存池 可以根据实际情况调整大小(事实证 

 //明很有用) 

 byte[] buffer = new byte[1024 * 50]; 

 while (true) { 

 int readsize = zis.read(buffer); 

 outputstream.write(buffer); 

 if (readsize < 1024 * 50) { 

 break; 

 } 

 } 

 } 

 } catch (FileNotFoundException e) { 

 e.printStackTrace(); 

 } catch (IOException e) { 

 e.printStackTrace(); 

 } finally { 

 try { 

 outputstream.flush(); 

 inputstream.close(); 

 zis.close(); 

 outputstream.close(); 

 } catch (Exception e) { 

 e.printStackTrace(); 

 } 


 } 


 } 


}


写一个测试类

public class TarTest{ 

 public static void main(String[] args){ 

 InflaterManager ifm=new InflaterManagerImpl(); 

 ifm.inflat("d:/a.tar"); 

 } 

}


呵呵 一段最简单功能的tar文件解析代码就完成了 如果需要压缩为tar文件的话javatar中也提供了相关的api有兴趣的话可以去看一看