Java使用GZip如何实现文件的压缩和解压

  介绍

本篇文章为大家展示了Java使用GZip如何实现文件的压缩和解压,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强> Maven依赖

org.apache.commons: commons-compress: 1.19:此依赖封装了很多压缩算法相关的工具类,提供的API还是相对比较底层,我们今天在它的基础上做进一步封装。

& lt; dependency>   & lt; groupId> org.apache.commons   & lt; artifactId> commons-compress   & lt; version> 1.19 & lt;/version>   & lt;/dependency>   & lt; dependency>   & lt; groupId> log4j   & lt; artifactId> log4j   & lt; version> 1.2.17   & lt;/dependency>

在实际应用中,对应不同需求,可能需要生成若干文件,然后将其压缩。在某些应用中,文件较小,文件数量较少且较为固定,频繁与磁盘操作,会带来不必要的效率影响。

工具类针对gz格式提供了compressByTar, decompressByTar, compressByGZip, decompressByGZip四个方法,用于处理. tar。广州格式压缩文件,代码如下:

包com.arhorchin.securitit.compress.gzip;
  
  进口java.io.ByteArrayInputStream;
  进口java.io.ByteArrayOutputStream;
  进口java.io.IOException;
  进口java.util.HashMap;
  进口java.util.Map;
  
  进口org.apache.commons.compress.archivers.tar.TarArchiveEntry;
  进口org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
  进口org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
  进口org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
  进口org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
  进口org.apache.commons.io.IOUtils;/* *
  * @author Securitit。
  * @note基于内存以ZIP算法进行压缩和解压工具类。
  */公开课GZipRamUtil {/* *
  *使用焦油算法进行压缩。
  * @param sourceFileBytesMap待压缩文件的映射集合。
  * @return压缩后的焦油文件字节数组。
  * @throws异常压缩过程中可能发生的异常,若发生异常,则返回的字节数组长度为0。
  */公共静态byte [] compressByTar (Map<字符串,byte[]比;{tarFileBytesMap)抛出异常//变量定义。
  ByteArrayOutputStream tarBaos=零;
  TarArchiveOutputStream tarTaos=零;
  TarArchiveEntry tarTae=零;
  
  尝试{//压缩变量初始化。
  tarBaos=new ByteArrayOutputStream ();
  tarTaos=new TarArchiveOutputStream (tarBaos);////将文件添加到焦油条目中。
  (Map.Entry<字符串,byte[]比;fileEntry: tarFileBytesMap.entrySet ()) {
  tarTae=new TarArchiveEntry (fileEntry.getKey ());
  tarTae.setName (fileEntry.getKey ());
  tarTae.setSize (fileEntry.getValue () . length);
  tarTaos.putArchiveEntry (tarTae);
  tarTaos.write (fileEntry.getValue ());
  tarTaos.closeArchiveEntry ();
  }
  最后}{
  如果(tarTaos !=null) {
  tarTaos.close ();
  }
  如果(null==tarBaos) {
  tarBaos=new ByteArrayOutputStream ();
  }
  }
  返回tarBaos.toByteArray ();
  }/* *
  *使用焦油算法进行解压。
  * @param sourceZipFileBytes焦油文件字节数组。
  * @return解压后的文件映射集合。
  * @throws异常解压过程中可能发生的异常,若发生异常,返回映射集合长度为0。
  */公共静态Map<字符串,byte[]比;{decompressByTar (byte [] sourceTarFileBytes)抛出异常//变量定义。
  TarArchiveEntry sourceTarTae=零;
  ByteArrayInputStream sourceTarBais=零;
  TarArchiveInputStream sourceTarTais=零;
  Map<字符串,byte[]比;targetFilesFolderMap=零;
  
  尝试{//解压变量初始化。
  targetFilesFolderMap=new HashMap<字符串,byte[]祝辞();
  sourceTarBais=new ByteArrayInputStream (sourceTarFileBytes);
  sourceTarTais=new TarArchiveInputStream (sourceTarBais);//条目解压缩至地图中。
  在((sourceTarTae=sourceTarTais.getNextTarEntry ()) !=null) {
  targetFilesFolderMap.put (sourceTarTae.getName (), IOUtils.toByteArray (sourceTarTais));
  }
  最后}{
  如果(sourceTarTais !=null)
  sourceTarTais.close ();
  }
  返回targetFilesFolderMap;
  }/* *
  *使用GZIP算法进行压缩。
  * @param sourceFileBytesMap待压缩文件的映射集合。
  * @return压缩后的GZIP文件字节数组。
  * @throws异常压缩过程中可能发生的异常,若发生异常,则返回的字节数组长度为0。
  */公共静态byte [] compressByGZip (byte [] sourceFileBytes)抛出IOException {//变量定义。
  ByteArrayOutputStream gzipBaos=零;
  GzipCompressorOutputStream gzipGcos=零;
  
  尝试{//压缩变量初始化。
  gzipBaos=new ByteArrayOutputStream ();
  gzipGcos=new GzipCompressorOutputStream (gzipBaos);//采用commons-compress提供的方式进行压缩。
  gzipGcos.write (sourceFileBytes);
  最后}{
  如果(gzipGcos !=null) {
  gzipGcos.close ();
  }
  如果(null==gzipBaos) {
  gzipBaos=new ByteArrayOutputStream ();
  }
  }
  返回gzipBaos.toByteArray ();
  }/* *
  *使用GZIP算法进行解压。
  * @param sourceGZipFileBytes GZIP文件字节数组。
  * @return解压后的文件映射集合。
  * @throws异常解压过程中可能发生的异常,若发生异常,则返回的字节数组长度为0。
  */公共静态byte [] decompressByGZip (byte [] sourceGZipFileBytes)抛出IOException {//变量定义。
  ByteArrayOutputStream gzipBaos=零;
  ByteArrayInputStream sourceGZipBais=零;
  GzipCompressorInputStream sourceGZipGcis=零;
  
  尝试{//解压变量初始化。
  gzipBaos=new ByteArrayOutputStream ();
  sourceGZipBais=new ByteArrayInputStream (sourceGZipFileBytes);
  sourceGZipGcis=new GzipCompressorInputStream (sourceGZipBais);//采用commons-compress提供的方式进行解压。
  gzipBaos.write (IOUtils.toByteArray (sourceGZipGcis));
  最后}{
  如果(sourceGZipGcis !=null)
  sourceGZipGcis.close ();
  }
  返回gzipBaos.toByteArray ();
  }
  
  }

Java使用GZip如何实现文件的压缩和解压