最近做的项目中涉及到了对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有兴趣的话可以去看一看