成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java GZip 基于磁盤實現壓縮和解壓的方法

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

  GZip是常用的無損壓縮算法實現,在Linux中較為常見,像我們在Linux安裝軟件時,基本都是.tar.gz格式。.tar.gz格式文件需要先對目錄內文件進行tar壓縮,然后使用GZip進行壓縮。

  本文針對基于磁盤的壓縮和解壓進行演示,演示只針對一層目錄結構進行,多層目錄只需遞歸操作進行即可。

  Maven依賴

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

<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>

  工具類

  其實,在通常情況下,我們都是在磁盤上進行壓縮和解壓操作的,這樣雖然增加了操作的復雜度,但是卻無形中避免了一些問題。

  工具類針對.tar.gz格式提供了compressByTar、decompressByTar、compressByGZip、decompressByGZip四個方法,用于處理.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 基于磁盤以GZIP算法進行壓縮和解壓工具類. */public class GZipDiskUtil { /** * logger. */ private static Logger logger = Logger.getLogger(GZipDiskUtil.class); /** * UTF-8字符集. */ public static String CHARSET_UTF8 = 'UTF-8'; /** * 使用TAR算法進行壓縮. * @param sourceFolderPath 待進行壓縮的文件夾路徑. * @param targetTarFilePath 壓縮后的TAR文件存儲目錄. * @return 壓縮是否成功. * @throws Exception 壓縮過程中可能發生的異常. */ 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算法進行解壓. * @param sourceTarPath 待解壓文件路徑. * @param targetFolderPath 解壓后文件夾目錄. * @return 解壓是否成功. * @throws Exception 解壓過程中可能發生的異常. */ 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算法進行壓縮. * @param sourceFilePath 待進行壓縮的文件路徑. * @param targetGZipFilePath 壓縮后的GZIP文件存儲目錄. * @return 壓縮是否成功. * @throws Exception 壓縮過程中可能發生的異常. */ 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提供的方式進行壓縮. 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算法進行解壓. * @param sourceGZipFilePath 待解壓文件路徑. * @param targetFilePath 解壓后文件路徑. * @return 解壓是否成功. * @throws @throws Exception 解壓過程中可能發生的異常. */ 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提供的方式進行解壓. 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; }}

  工具類測試

  在Maven依賴引入正確的情況下,復制上面的代碼到項目中,修改package,可以直接使用,下面我們對工具類進行簡單測試。測試類代碼如下:

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

  運行測試后,通過查看disk.tar、disk.tar.gz、disk-untar.tar和解壓的目錄,可以確認工具類運行結果無誤。

  總結

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

  2) 在大文件、文件數量較大時,提倡使用磁盤壓縮和解壓方式。過大文件對服務會造成過度的負載,磁盤壓縮和解壓可以緩解這種壓力。

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人黄色在线网站| 91蜜桃在线免费视频| 26uuu色噜噜精品一区二区| 午夜精品久久久久久久久久久| av电影在线观看一区| 亚洲国产欧美日韩| 亚洲一区视频在线观看视频| 精品久久久久久最新网址| 成人一级片在线观看| 欧美高清一级片在线观看| 久久蜜桃精品| 久久国产综合精品| 亚洲欧美成aⅴ人在线观看| 欧美色综合网| 91精品国产高清一区二区三区蜜臀| 日韩av一级片| 日本久久一区二区| 日韩精品福利网| 亚洲经典视频在线观看| 国产精品区一区二区三| 91美女精品福利| 久久久99久久| 你懂的亚洲视频| 国产欧美精品一区aⅴ影院| 欧美日韩视频| 亚洲视频免费在线观看| 亚洲成人资源| 亚洲欧美一区二区三区国产精品 | 成人午夜视频免费看| 91精品国产麻豆| 国产成人在线网站| 精品国产网站在线观看| 91麻豆高清视频| 日本一区免费视频| 一区二区视频在线观看| 国产精品九色蝌蚪自拍| 一区二区三区四区五区视频| 亚洲色图.com| 国产视频一区免费看| 亚洲一卡二卡三卡四卡五卡| 先锋影音国产一区| 奇米影视在线99精品| 欧美三级中文字幕| 国产精品亚洲第一| 国产亚洲视频系列| 在线欧美不卡| 偷拍一区二区三区四区| 欧美日韩日本视频| 成人性生交大片免费看视频在线| 久久亚洲一级片| 在线观看欧美亚洲| 丝袜亚洲精品中文字幕一区| 欧美日韩国产高清一区| 成人免费视频网站在线观看| 国产视频视频一区| 亚洲乱码视频| 日韩和的一区二区| 欧美喷水一区二区| 99在线精品观看| 国产精品美女久久久久av爽李琼| 99精品国产在热久久下载| 五月综合激情网| 欧美电影在哪看比较好| 91啪九色porn原创视频在线观看| 中文字幕一区二区三区乱码在线| 亚洲一区日韩在线| 久久er精品视频| 2023国产一二三区日本精品2022| 激情婷婷久久| 麻豆精品一二三| ww亚洲ww在线观看国产| 在线观看亚洲| 日韩综合在线视频| 日韩一区二区三免费高清| 欧美在线播放一区二区| 夜夜揉揉日日人人青青一国产精品 | 亚洲成人动漫av| 69久久夜色精品国产69蝌蚪网| 欧美日韩国产综合在线| 五月天欧美精品| 精品少妇一区二区三区日产乱码 | 日本aⅴ精品一区二区三区 | 韩国一区二区在线观看| 国产网站一区二区三区| 性久久久久久| 成人av午夜电影| 亚洲一区二区四区蜜桃| 日韩欧美激情在线| 国产日韩亚洲| 国产一区二区三区蝌蚪| 国产清纯白嫩初高生在线观看91| 久久天堂国产精品| 91视频你懂的| 日韩国产一区二| 日本一区二区三区免费乱视频| 免费日韩精品中文字幕视频在线| 成人国产精品免费观看动漫| 亚洲一区欧美一区| 日韩三级精品电影久久久| 一区二区三区欧美在线| 成人综合在线观看| 亚洲午夜久久久久久久久久久| 日韩一级片在线观看| 亚洲一区综合| 色综合中文综合网| 精品国产一区a| 色一区在线观看| 午夜欧美精品| 久久精品国产精品青草| 国产精品久久久一区麻豆最新章节| 色哟哟欧美精品| 国产精品hd| 国产精品自在在线| 亚洲一区二区免费视频| 久久蜜臀精品av| 欧美日韩一区二区电影| 极品日韩久久| 国产91精品免费| 天天综合色天天| 国产精品三级av| 欧美一级片在线观看| 久久久久久亚洲精品不卡4k岛国| 午夜欧美精品| 高清在线成人网| 视频一区二区欧美| 国产精品国产自产拍高清av王其| 欧美一级高清大全免费观看| 一本大道av伊人久久综合| 国内久久视频| 成人网页在线观看| 麻豆精品久久精品色综合| 亚洲黄色av一区| 欧美激情一区在线观看| 日韩亚洲欧美成人一区| 欧美最新大片在线看| 欧美亚洲网站| 99精品国产在热久久婷婷| 欧美黄色一级视频| 国产激情一区二区三区四区| 日韩综合小视频| 亚洲精品福利视频网站| 欧美国产综合一区二区| 欧美不卡一区二区| 欧美美女bb生活片| 一本大道久久a久久精二百| 一区二区91| 午夜亚洲福利| 波多野结衣欧美| 国产乱淫av一区二区三区| 人人精品人人爱| 亚洲aaa精品| 一个色在线综合| 亚洲三级电影全部在线观看高清| 久久只精品国产| 91精品欧美福利在线观看 | 中文字幕免费在线观看视频一区| 日韩美女在线视频| 91精品国产色综合久久ai换脸| 欧美视频日韩视频在线观看| 色哟哟精品一区| 久久午夜电影| 久久中文在线| 久久国产一区| 亚洲欧美日韩在线综合| 国产欧美日韩一级| 99av国产精品欲麻豆| 在线观看成人av电影| 欧美日韩国产成人精品| 欧美xxx在线观看| 午夜精品一区二区三区四区| 欧美伊人影院| 欧美精品三区| 欧美日韩岛国| 黄色日韩精品| 精品不卡一区| 伊人精品成人久久综合软件| 激情自拍一区| 在线一区欧美| 99xxxx成人网| 国产日韩欧美一区二区三区在线观看 | 日韩亚洲欧美精品| 亚洲美女色禁图| 日韩亚洲一区在线播放| 国产日产高清欧美一区二区三区| 99精品国产一区二区青青牛奶| 国产精品久久久免费| 国产精品久久国产三级国电话系列| 91久久久久| 99国产精品久久久久老师| av成人免费观看| 亚洲一区二区三区欧美| 久久国产欧美| 欧美亚洲综合色| 911精品国产一区二区在线| 91精品国产综合久久久蜜臀粉嫩 | 在线视频你懂得一区| 在线区一区二视频| 欧美丰满美乳xxx高潮www| 欧美mv和日韩mv国产网站| 久久亚洲精华国产精华液 |