在本文中主要阐述如何用程序的方法解压tar.gz文件,tar是把文件打成一个包,并不压缩;.gz是用gzip把打成包的.tar文件压缩,所以成了一个.tar.gz的文件,这是linux下面常见的压缩文件格式。
在尝试了ZipFile之后,发现仅仅jdk里面提供的类及方法不足以解压tar.gz文件,于是用到了commons-compress-1.0.jar,它是apache提供的jar包,需要的话可以在附件中下载。
下面的程序片段提供了解压文件的方法,其中outputDirectory是解压后的文件存放位置,zipfileName是待解压的文件。in.getNextEntry()以深度遍历的方法取得下一个文件或者文件夹,如果一个文件夹的结构如下所示
root
--- folder1
-- file1.txt
--- folder2
-- folder3
--- file2.bmp
则entry.getName输出结果为:
root/
root/folder1/
root/folder/file1.txt
root/folder2/
root/folder2/folder3
root/folder2/folder3/file2.bmp
根据输出的结果可以判断出是文件夹还是文件。(是否以"/"结尾) 如果是文件,需要将文件的内容复制一份到新的文件中,否则只需要创建一个文件夹即可。
public void unzipFile(String outputDirectory, String zipfileName) {
FileInputStream fis = null;
ArchiveInputStream in = null;
BufferedInputStream bufferedInputStream = null;
try {
fis = new FileInputStream(zipfileName);
GZIPInputStream is = new GZIPInputStream(new BufferedInputStream(
fis));
in = new ArchiveStreamFactory().createArchiveInputStream("tar", is);
bufferedInputStream = new BufferedInputStream(in);
TarArchiveEntry entry = (TarArchiveEntry) in.getNextEntry();
while (entry != null) {
String name = entry.getName();
String[] names = name.split("/");
String fileName = outputDirectory;
for (String str : names) {
fileName = fileName + File.separator + str;
}
if (name.endsWith("/")) {
mkFolder(fileName);
} else {
File file = mkFile(fileName);
bufferedOutputStream = new BufferedOutputStream(
new FileOutputStream(file));
int b;
while ((b = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(b);
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
entry = (TarArchiveEntry) in.getNextEntry();
}
} catch (...)
}