`

解压tar.gz文件

阅读更多

在本文中主要阐述如何用程序的方法解压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 (...)
	}
 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics