国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java GZip 基于磁盤(pán)實(shí)現(xiàn)壓縮和解壓的方法

瀏覽:80日期:2022-08-26 11:52:59

  GZip是常用的無(wú)損壓縮算法實(shí)現(xiàn),在Linux中較為常見(jiàn),像我們?cè)贚inux安裝軟件時(shí),基本都是.tar.gz格式。.tar.gz格式文件需要先對(duì)目錄內(nèi)文件進(jìn)行tar壓縮,然后使用GZip進(jìn)行壓縮。

  本文針對(duì)基于磁盤(pán)的壓縮和解壓進(jìn)行演示,演示只針對(duì)一層目錄結(jié)構(gòu)進(jìn)行,多層目錄只需遞歸操作進(jìn)行即可。

  Maven依賴

  org.apache.commons: commons-compress: 1.19: 此依賴封裝了很多壓縮算法相關(guān)的工具類,提供的API還是相對(duì)比較底層,我們今天在它的基礎(chǔ)上做進(jìn)一步封裝。

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.19</version></dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>

  工具類

  其實(shí),在通常情況下,我們都是在磁盤(pán)上進(jìn)行壓縮和解壓操作的,這樣雖然增加了操作的復(fù)雜度,但是卻無(wú)形中避免了一些問(wèn)題。

  工具類針對(duì).tar.gz格式提供了compressByTar、decompressByTar、compressByGZip、decompressByGZip四個(gè)方法,用于處理.tar.gz格式壓縮文件,代碼如下:

package com.arhorchin.securitit.compress.gzip;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 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.compressors.gzip.GzipCompressorInputStream;import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;import org.apache.commons.compress.utils.IOUtils;import org.apache.log4j.Logger;/** * @author Securitit. * @note 基于磁盤(pán)以GZIP算法進(jìn)行壓縮和解壓工具類. */public class GZipDiskUtil { /** * logger. */ private static Logger logger = Logger.getLogger(GZipDiskUtil.class); /** * UTF-8字符集. */ public static String CHARSET_UTF8 = 'UTF-8'; /** * 使用TAR算法進(jìn)行壓縮. * @param sourceFolderPath 待進(jìn)行壓縮的文件夾路徑. * @param targetTarFilePath 壓縮后的TAR文件存儲(chǔ)目錄. * @return 壓縮是否成功. * @throws Exception 壓縮過(guò)程中可能發(fā)生的異常. */ public static boolean compressByTar(String sourceFolderPath, String targetTarFilePath) throws Exception { // 變量定義. File sourceFolderFile = null; FileOutputStream targetTarFos = null; TarArchiveOutputStream targetTartTaos = null; TarArchiveEntry targetTarTae = null; try { // 壓縮變量初始化. sourceFolderFile = new File(sourceFolderPath); targetTarFos = new FileOutputStream(new File(targetTarFilePath)); targetTartTaos = new TarArchiveOutputStream(targetTarFos); // 將文件添加到ZIP條目中. for (File file : sourceFolderFile.listFiles()) { try (FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis);) { targetTarTae = new TarArchiveEntry(file); targetTarTae.setName(file.getName()); targetTartTaos.putArchiveEntry(targetTarTae); targetTartTaos.write(IOUtils.toByteArray(bis)); targetTartTaos.closeArchiveEntry(); } } } catch (Exception ex) { logger.info('GZipDiskUtil.compressByTar.', ex); return false; } finally { if (targetTartTaos != null) targetTartTaos.close(); if (targetTarFos != null) targetTarFos.close(); } return true; } /** * 使用TAR算法進(jìn)行解壓. * @param sourceTarPath 待解壓文件路徑. * @param targetFolderPath 解壓后文件夾目錄. * @return 解壓是否成功. * @throws Exception 解壓過(guò)程中可能發(fā)生的異常. */ public static boolean decompressByTar(String sourceTarPath, String targetFolderPath) throws Exception { // 變量定義. FileInputStream sourceTarFis = null; TarArchiveInputStream sourceTarTais = null; TarArchiveEntry sourceTarTae = null; File singleEntryFile = null; try { // 解壓定義初始化. sourceTarFis = new FileInputStream(new File(sourceTarPath)); sourceTarTais = new TarArchiveInputStream(sourceTarFis); // 條目解壓縮至指定文件夾目錄下. while ((sourceTarTae = sourceTarTais.getNextTarEntry()) != null) { singleEntryFile = new File(targetFolderPath + File.separator + sourceTarTae.getName()); try (FileOutputStream fos = new FileOutputStream(singleEntryFile); BufferedOutputStream bos = new BufferedOutputStream(fos);) { bos.write(IOUtils.toByteArray(sourceTarTais)); } } } catch (Exception ex) { logger.info('GZipDiskUtil.decompressByTar.', ex); return false; } finally { if (sourceTarTais != null) sourceTarTais.close(); if (sourceTarFis != null) sourceTarFis.close(); } return true; } /** * 使用GZIP算法進(jìn)行壓縮. * @param sourceFilePath 待進(jìn)行壓縮的文件路徑. * @param targetGZipFilePath 壓縮后的GZIP文件存儲(chǔ)目錄. * @return 壓縮是否成功. * @throws Exception 壓縮過(guò)程中可能發(fā)生的異常. */ public static boolean compressByGZip(String sourceFilePath, String targetGZipFilePath) throws IOException { // 變量定義. FileInputStream sourceFileFis = null; BufferedInputStream sourceFileBis = null; FileOutputStream targetGZipFileFos = null; BufferedOutputStream targetGZipFileBos = null; GzipCompressorOutputStream targetGZipFileGcos = null; try { // 壓縮變量初始化. sourceFileFis = new FileInputStream(new File(sourceFilePath)); sourceFileBis = new BufferedInputStream(sourceFileFis); targetGZipFileFos = new FileOutputStream(targetGZipFilePath); targetGZipFileBos = new BufferedOutputStream(targetGZipFileFos); targetGZipFileGcos = new GzipCompressorOutputStream(targetGZipFileBos); // 采用commons-compress提供的方式進(jìn)行壓縮. targetGZipFileGcos.write(IOUtils.toByteArray(sourceFileBis)); } catch (Exception ex) { logger.info('GZipDiskUtil.compressByGZip.', ex); return false; } finally { if (targetGZipFileGcos != null) targetGZipFileGcos.close(); if (targetGZipFileBos != null) targetGZipFileBos.close(); if (targetGZipFileFos != null) targetGZipFileFos.close(); if (sourceFileBis != null) sourceFileBis.close(); if (sourceFileFis != null) sourceFileFis.close(); } return true; } /** * 使用GZIP算法進(jìn)行解壓. * @param sourceGZipFilePath 待解壓文件路徑. * @param targetFilePath 解壓后文件路徑. * @return 解壓是否成功. * @throws @throws Exception 解壓過(guò)程中可能發(fā)生的異常. */ public static boolean decompressByGZip(String sourceGZipFilePath, String targetFilePath) throws IOException { // 變量定義. FileInputStream sourceGZipFileFis = null; BufferedInputStream sourceGZipFileBis = null; FileOutputStream targetFileFos = null; GzipCompressorInputStream sourceGZipFileGcis = null; try { // 解壓變量初始化. sourceGZipFileFis = new FileInputStream(new File(sourceGZipFilePath)); sourceGZipFileBis = new BufferedInputStream(sourceGZipFileFis); sourceGZipFileGcis = new GzipCompressorInputStream(sourceGZipFileBis); targetFileFos = new FileOutputStream(new File(targetFilePath)); // 采用commons-compress提供的方式進(jìn)行解壓. targetFileFos.write(IOUtils.toByteArray(sourceGZipFileGcis)); } catch (Exception ex) { logger.info('GZipDiskUtil.decompressByGZip.', ex); return false; } finally { if (sourceGZipFileGcis != null) sourceGZipFileGcis.close(); if (sourceGZipFileBis != null) sourceGZipFileBis.close(); if (sourceGZipFileFis != null) sourceGZipFileFis.close(); if (targetFileFos != null) targetFileFos.close(); } return true; }}

  工具類測(cè)試

  在Maven依賴引入正確的情況下,復(fù)制上面的代碼到項(xiàng)目中,修改package,可以直接使用,下面我們對(duì)工具類進(jìn)行簡(jiǎn)單測(cè)試。測(cè)試類代碼如下:

package com.arhorchin.securitit.compress.gzip;import com.arhorchin.securitit.compress.gzip.GZipDiskUtil;/** * @author Securitit. * @note GZipDiskUtil工具類測(cè)試. */public class GZipDiskUtilTester { public static void main(String[] args) throws Exception { GZipDiskUtil.compressByTar('C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/files', 'C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk.tar'); GZipDiskUtil.compressByGZip('C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk.tar', 'C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk.tar.gz'); GZipDiskUtil.decompressByGZip('C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk.tar.gz', 'C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk-untar.tar'); GZipDiskUtil.decompressByTar('C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk-untar.tar', 'C:/Users/Administrator/Downloads/個(gè)人文件/2020-07-13/disk-untar'); }}

  運(yùn)行測(cè)試后,通過(guò)查看disk.tar、disk.tar.gz、disk-untar.tar和解壓的目錄,可以確認(rèn)工具類運(yùn)行結(jié)果無(wú)誤。

  總結(jié)

  1) 在小文件、文件數(shù)量較小且較為固定時(shí),提倡使用內(nèi)存壓縮和解壓方式。使用內(nèi)存換時(shí)間,減少頻繁的磁盤(pán)操作。《Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓》

  2) 在大文件、文件數(shù)量較大時(shí),提倡使用磁盤(pán)壓縮和解壓方式。過(guò)大文件對(duì)服務(wù)會(huì)造成過(guò)度的負(fù)載,磁盤(pán)壓縮和解壓可以緩解這種壓力。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 中文字幕一区二区三区免费视频 | 亚洲国产精品一区二区久 | 女人被男人躁得好爽免费文 | 亚洲一区免费在线 | 亚洲精品手机在线 | 免费欧美黄色 | 99久久精品免费观看区一 | 久久99精品九九九久久婷婷 | 亚洲欧美日韩专区 | 精品午夜一区二区三区在线观看 | 成年人黄色片 | 热99re久久国超精品首页 | 美女做爰视频在线观看免费 | 亚洲一区二区三区精品影院 | 亚洲精品资源网在线观看 | www.99精品视频在线播放 | 欧美成年黄网站色高清视频 | 国产精品国产精品国产三级普 | 日韩一区二区中文字幕 | 中文字幕在线成人免费看 | 九九精彩视频在线观看视频 | 欧美黑粗特黄午夜大片 | 久久九九热视频 | 国产成人在线免费观看 | 国产亚洲欧美一区 | 日韩中文字幕在线视频 | 青青热久久国产久精品 | 国产美女午夜精品福利视频 | 日韩经典中文字幕 | 亚洲操图 | 午夜免费毛片 | 欧美日本免费观看αv片 | 欧美性猛交xxxxx按摩国内 | 国产精品久久国产精品99 | 久久精品国产线看观看亚洲 | 亚欧在线视频 | 中国老太卖淫播放毛片 | 成人福利网站在线看视频 | 久久影院yy6080 | 91久久青草精品38国产 | 久久www免费人成_看片高清 |