java实现对zip、tar、gzip(gz)的压缩与解压

话不多说,开始吧!

准备工作:在pom.xml中引入依赖

<!-- 
	  Apache Commons Compress software defines an API for working with compression
	  and archive formats. These include: bzip2, gzip(即.gz), pack200, lzma, xz, Snappy, 
	  traditional Unix Compress, DEFLATE, DEFLATE64, LZ4, Brotli, Zstandard and ar, cpio,
	  jar, tar, zip, dump, 7z, arj. 
-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.18</version>
</dependency>

直入主题 -> 给出工具类

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;

/**
 * 压缩、解压 -> 工具类
 * 更多示例,可见官网:http://commons.apache.org/proper/commons-compress/examples.html
 * 总体说明:如果有同名的文件,那么压缩/解压后的文件将会覆盖原来的文件
 *
 * @author JustryDeng
 * @DATE 2018年9月25日 下午12:26:47
 */
public class CompressionAndDecompressionUtils {

	/**
	 * tar打包压缩
	 *
	 * @param filesPathArray
	 *            要压缩的文件的全路径(数组)
	 * @param resultFilePath
	 *            压缩后的文件全文件名(.tar)
	 * @throws Exception
	 * @DATE 2018年9月25日 下午12:39:28
	 */
	public static boolean tarCompression(String[] filesPathArray, String resultFilePath) throws Exception {
		System.out.println(" tarCompression -> Compression start!");
		FileOutputStream fos = null;
		TarArchiveOutputStream taos = null;
		try {
			fos = new FileOutputStream(new File(resultFilePath));
			taos = new TarArchiveOutputStream(fos);
			for (String filePath : filesPathArray) {
				BufferedInputStream bis = null;
				FileInputStream fis = null;
				try {
					File file = new File(filePath);
					TarArchiveEntry tae = new TarArchiveEntry(file);
					// 此处指明 每一个被压缩文件的名字,以便于解压时TarArchiveEntry的getName()方法获取到的直接就是这里指定的文件名
					// 以(左边的)GBK编码将file.getName()“打碎”为序列,再“组装”序列为(右边的)GBK编码的字符串
					tae.setName(new String(file.getName().getBytes("GBK"), "GBK"));
					taos.putArchiveEntry(tae);
					fis = new FileInputStream(file);
					bis = new BufferedInputStream(fis);
					int count;
					byte data[] = new byte[1024];
					while ((count = bis.read(data, 0, 1024)) != -1) {
						taos.write(data, 0, count);
					}
				} finally {
					taos.closeArchiveEntry();
					if (bis != null) 
					    bis.close();
					if (fis != null) 
					    fis.close();
				}
			} 
		} finally {
			if (taos != null) 
			    taos.close();
			if (fos != null) 
			    fos.close();
			
		}
		System.out.println(" tarCompression -> Compression end!");
		return true;
	}

	/**
	 * tar拆包解压
	 *
	 * @param decompressFilePath
	 *            要被解压的压缩文件 全路径
	 * @param resultDirPath
	 *            解压文件存放绝对路径(目录)
	 * @throws Exception
	 * @DATE 2018年9月25日 下午12:39:43
	 */
	public static boolean tarDecompression(String decompressFilePath, String resultDirPath) throws Exception {
		System.out.println(" tarDecompression -> Decompression start!");
		TarArchiveInputStream tais = null;
		FileInputStream fis = null;
		try {
			File file = new File(decompressFilePath);
			fis = new FileInputStream(file);
			tais = new TarArchiveInputStream(fis);
			TarArchiveEntry tae = null;
			while ((tae = tais.getNextTarEntry()) != null) {
				BufferedOutputStream bos = null;
				FileOutputStream fos = null;
				try {
					System.out.println("  already decompression file -> " + tae.getName());
					String dir = resultDirPath + File.separator + tae.getName();// tar档中文件
					File dirFile = new File(dir);
					fos = new FileOutputStream(dirFile);
					bos = new BufferedOutputStream(fos);
					int count;
					byte[] data = new byte[1024];
					while ((count = tais.read(data, 0, 1024)) != -1) {
						bos.write(data, 0, count);
					}
				} finally {
					if (bos != null) 
					    bos.close();
					if (fos != null) 
					    fos.close();
				}
			} 
		} finally {
			if (tais != null)
			    tais.close();
			if (fis != null) 
			    fis.close();
		}
		System.out.println(" tarDecompression -> Decompression end!");
		return true;
	}

	/**
	 * 对.tar文件进行gzip压缩
	 * 说明:我们一般先把多个文件tar打包为一个,然后再使用gzip进行压缩; 进而获得形如“abc.tar.gz”这样的压缩文件
	 *  注:这里暂时不再深入学习,以后有闲暇时间可深入了解如何压缩多个文件等
	 *  注:如果明确知道解压后的是什么类型的文件;那么可以直接指定解压后的文件类型(实际上也需要这么做);
	 *     .tar.gz 解压后就是.tar文件,所以我们在解压时,给出的解压后的文件的全路径名就是以.tar结尾的
	 * @param filePath
	 *            要被压缩的压缩文件 全路径
	 * @param resultFilePath
	 *            压缩后的文件(全文件名 .gz)
	 * @throws IOException
	 * @DATE 2018年9月25日 下午2:50:22
	 */
	public static boolean gzipCompression(String filePath, String resultFilePath) throws IOException {
		System.out.println(" gzipCompression -> Compression start!");
		InputStream fin = null;
		BufferedInputStream bis = null;
		FileOutputStream fos = null;
		BufferedOutputStream bos= null;
		GzipCompressorOutputStream gcos = null;
		try {
			fin = Files.newInputStream(Paths.get(filePath));
			bis = new BufferedInputStream(fin);
			fos = new FileOutputStream(resultFilePath);
			bos = new BufferedOutputStream(fos);
			gcos = new GzipCompressorOutputStream(bos);
			byte[] buffer = new byte[1024];
			int read = -1;
			while ((read = bis.read(buffer)) != -1) {
				gcos.write(buffer, 0, read);
			}
		} finally {
			if(gcos != null)
			    gcos.close();
			if(bos != null)
			    bos.close();
			if(fos != null)
				fos.close();
			if(bis != null)
			    bis.close();
			if(fin != null)
			    fin.close();
		}
		System.out.println(" gzipCompression -> Compression end!");
		return true;
	}

	/**
	 * 解压对.tar.gz文件至 .tar文件
	 * 说明:我们一般都是对.tar.gz文件进行gzip解压; 进而获得形如.tar文件;再进行解压
	 *   注:这里暂时不再深入学习,以后有闲暇时间可深入了解学习
	 * 
	 * @param <GzipArchiveEntry>
	 *
	 * @param compressedFilePath
	 *            要被解压的压缩文件 全路径
	 * @param resultDirPath
	 *            解压文件存放绝对路径(目录)
	 * @throws IOException
	 * @DATE 2018年9月25日 下午4:35:09
	 */
	public static  boolean gzipDecompression(String compressedFilePath, String resultDirPath) throws IOException {
		System.out.println(" gzipDecompression -> Compression start!");
		InputStream fin = null;
		BufferedInputStream in = null;
		OutputStream out = null;
		GzipCompressorInputStream gcis = null;
		try {
			out = Files.newOutputStream(Paths.get(resultDirPath));
			fin = Files.newInputStream(Paths.get(compressedFilePath));
			in = new BufferedInputStream(fin);
			gcis = new GzipCompressorInputStream(in);
			final byte[] buffer = new byte[1024];
			int n = 0;
			while (-1 != (n = gcis.read(buffer))) {
				out.write(buffer, 0, n);
			} 
		} finally {
			if(gcis != null)
			    gcis.close();
			if(in != null)
			    in.close();
			if(fin != null)
			    fin.close();
			if(out != null)
				out.close();
		}
		System.out.println(" gzipDecompression -> Compression end!");
		return true;
	}
	
	
	/**
	 * zip压缩(注:与tar类似)
	 *
	 * @param filesPathArray
	 *            要压缩的文件的全路径(数组)
	 * @param resultFilePath
	 *            压缩后的文件全文件名(.tar)
	 * @throws Exception
	 * @DATE 2018年9月25日 下午17:55:28
	 */
	public static boolean zipCompression(String[] filesPathArray, String resultFilePath) throws Exception {
		System.out.println(" zipCompression -> Compression start!");
		ZipArchiveOutputStream zaos = null;
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(new File(resultFilePath));
			zaos = new ZipArchiveOutputStream(fos);
			for (String filePath : filesPathArray) {
				FileInputStream fis = null;
				BufferedInputStream bis = null;
				try {
					File file = new File(filePath);
					// 第二个参数如果是文件全路径名,那么压缩时也会将路径文件夹也缩进去;
					// 我们之压缩目标文件,而不压缩该文件所处位置的相关文件夹,所以这里我们用file.getName()
					ZipArchiveEntry zae = new ZipArchiveEntry(file, file.getName());
					zaos.putArchiveEntry(zae);
					fis = new FileInputStream(file);
					bis = new BufferedInputStream(fis);
					int count;
					byte data[] = new byte[1024];
					while ((count = bis.read(data, 0, 1024)) != -1) {
						zaos.write(data, 0, count);
					}
				} finally {
					zaos.closeArchiveEntry();
					if (bis != null)
					    bis.close();
					if (fis != null)
					    fis.close();
				}

			} 
		} finally {
			if (zaos != null)
			    zaos.close();
			if (fos != null)
			    fos.close();
		}
		System.out.println(" zipCompression -> Compression end!");
		return true;
	}

	/**
	 * zip解压(注:与tar类似)
	 *
	 * @param decompressFilePath
	 *            要被解压的压缩文件 全路径
	 * @param resultDirPath
	 *            解压文件存放绝对路径(目录)
	 * @throws Exception
	 * @DATE 2018年9月25日 下午18:39:43
	 */
	public static boolean zipDecompression(String decompressFilePath, String resultDirPath) throws Exception {
		System.out.println(" zipDecompression -> Decompression start!");
		ZipArchiveInputStream zais = null;
		FileInputStream fis = null;
		try {
			File file = new File(decompressFilePath);
			fis = new FileInputStream(file);
			zais = new ZipArchiveInputStream(fis);
			ZipArchiveEntry zae = null;
			while ((zae = zais.getNextZipEntry()) != null) {
				FileOutputStream fos = null;
				BufferedOutputStream bos = null;
				try {
					System.out.println("  already decompression file -> " + zae.getName());
					String dir = resultDirPath + File.separator + zae.getName();// tar档中文件
					File dirFile = new File(dir);
					fos = new FileOutputStream(dirFile);
					bos = new BufferedOutputStream(fos);
					int count;
					byte data[] = new byte[1024];
					while ((count = zais.read(data, 0, 1024)) != -1) {
						bos.write(data, 0, count);
					}
				} finally {
					if (bos != null) 
						bos.close();
					if (fos != null)
						fos.close();
				}
			} 
		} finally {
			if (zais != null)
			    zais.close();
			if (fis != null)
				fis.close();
		}
		System.out.println(" zipDecompression -> Decompression end!");
		return true;
	}

}

 

微笑参考链接
           http://commons.apache.org/proper/commons-compress/examples.html

           https://blog.csdn.net/u013066244/article/details/72783575
微笑代码(工具类、以及测试代码)托管链接

            https://github.com/JustryDeng/PublicRepository

微笑如有不当之处,欢迎指正

微笑本文已经被收录进《程序员成长笔记(三)》,笔者JustryDeng

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
程序测试可用,直接解压导入到工程就可以,bat文件跟shell文件是用于在window跟linux上直接执行的脚本 我把开发的配置文档附上: 1.程序为定时任务,任务执行时间在bin目录下的配置文件mergeFilleUtil.properties中配置,在配置文件中,TASK_PERIOD表示任务执行时间间隔,单位为妙,如一天的时间间隔配置是86400,TASK_BEGIN_HOUR表示任务开始的小时时间,比如9点,TASK_BEGIN_MINUTE表任务开始的分钟,比如30分。 2. 程序用log4j记录日志,日志分正常信息跟错误信息两个级别,日志文件存放在log4j文件夹下。考虑到文件很多,日志解压、移动文件每解压、移动1000个记录一次,合并、删除文件每合并、删除50000个记录一次, 3. 启动任务前需配置文件解压合并的路径,本程序需配置的路径如下: 1). PROVINCE_DIR:原始文件存放的路径,必须配置到省的上一级路径,比如存放安徽省的文件路径为E:\test\rootfile\anhui,那么文件的路径必须配置为E:\test\rootfile,否则不能正确显示合并结果; 2). UN_ZIP_PATH:存放解压后的文件的路径; 3). OUT_PATH:存放合并后的文件路径; 4). DONE_FILE_PATH:存放已经解压处理过的文件; 5). DELETE_PATH:配置程序运行结束后欲删除文件的路径,如想删除多个文件夹下的文件,路径之间用逗号隔开,勿加空格,比如:E:\test\rootfile,E:\test\unZip; 4. 注意事项: 本解压合并程序处理文件的逻辑如下: 程序每次解压都去PROVINCE_DIR文件下去解压,将解压后的文件存放到UN_ZIP_PATH下,之后程序启动合并程序合并UN_ZIP_PATH下文件,将合并后的文件按照省份名称存放到OUT_PATH,一个省一个文件。当解压合并结束后,程序将PROVINCE_DIR路径下的文件移动到DONE_FILE_PATH下,并且删除PROVINCE_DIR跟UN_ZIP_PATH下文件,这样保证程序每次运行PROVINCE_DIR文件夹下的文件跟UN_ZIP_PATH下的文件都是最新未处理过的,避免了不断判断文件历史记录所带来的大量时间消耗。 所以为了保证文件解压跟合并的正确性,必须配置好DELETE_PATH路径下的文件,否则合并后的结果是不准确的。
在Linux中,要使用tar.gz命令来压缩指定目录。首先,tar命令用于将文件或文件夹打包成.tar文件,然后通过使用gzip命令将.tar文件进行压缩,生成.tar.gz文件。下面是具体的步骤: 1. 使用tar命令将目标文件或文件夹打包成.tar文件:tar -cvf filename.tar 目标目录路径 2. 使用gzip命令对.tar文件进行压缩,生成.tar.gz文件:gzip filename.tar 以上两个命令可以结合在一起,直接使用tar命令的-z参数来实现将文件或文件夹打包并压缩成.tar.gz文件:tar -zcvf filename.tar.gz 目标目录路径 其中,-c表示创建新的压缩文件,-v表示显示详细信息,-f表示指定压缩文件的名称,-z表示使用gzip进行压缩。 请注意,如果你要压缩的是一个文件夹而不是单个文件,请使用-r参数来递归地处理目录和其中的文件:tar -zcvf filename.tar.gz -r 目标目录路径 通过以上步骤,你可以使用tar.gz命令在Linux中压缩指定目录。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux下 *.tar.gz文件解压缩命令](https://blog.csdn.net/qq_43833393/article/details/129748100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux压缩解压tar.gzzip包命令汇总](https://blog.csdn.net/Suviseop/article/details/127556207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值