日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java压缩技术(三) ZIP解压缩——Java原生实现

發布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java压缩技术(三) ZIP解压缩——Java原生实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自? ?Java壓縮技術(三) ZIP解壓縮——Java原生實現

解壓縮與壓縮運作方式相反,原理大抵相同,由ZipInputStream通過read方法對數據解壓,同時需要通過CheckedInputStream設置冗余校驗碼,如:?

Java代碼??
  • CheckedInputStream?cis?=?new?CheckedInputStream(new?FileInputStream(??
  • ????????srcFile),?new?CRC32());??
  • ??
  • ZipInputStream?zis?=?new?ZipInputStream(cis);??

  • 需要注意的是,在構建解壓文件時,需要考慮目錄的自動創建,這里通過遞歸方式逐層創建父目錄,如下所示:?
    Java代碼??
  • /**?
  • ?*?文件探針?
  • ?*??
  • ?*??
  • ?*?當父目錄不存在時,創建目錄!?
  • ?*??
  • ?*??
  • ?*?@param?dirFile?
  • ?*/??
  • private?static?void?fileProber(File?dirFile)?{??
  • ??
  • ????File?parentFile?=?dirFile.getParentFile();??
  • ????if?(!parentFile.exists())?{??
  • ??
  • ????????//?遞歸尋找上級目錄??
  • ????????fileProber(parentFile);??
  • ??
  • ????????parentFile.mkdir();??
  • ????}??
  • ??
  • }??

  • 在壓縮的時候,我們是將一個一個文件作為壓縮添加項(ZipEntry)添加至壓縮包中,解壓縮就要將一個一個壓縮項從壓縮包中提取出來,如下所示:?
    Java代碼??
  • /**?
  • ?*?文件?解壓縮?
  • ?*??
  • ?*?@param?destFile?
  • ?*????????????目標文件?
  • ?*?@param?zis?
  • ?*????????????ZipInputStream?
  • ?*?@throws?Exception?
  • ?*/??
  • private?static?void?decompress(File?destFile,?ZipInputStream?zis)??
  • ????????throws?Exception?{??
  • ??
  • ????ZipEntry?entry?=?null;??
  • ????while?((entry?=?zis.getNextEntry())?!=?null)?{??
  • ??
  • ????????//?文件??
  • ????????String?dir?=?destFile.getPath()?+?File.separator?+?entry.getName();??
  • ??
  • ????????File?dirFile?=?new?File(dir);??
  • ??
  • ????????//?文件檢查??
  • ????????fileProber(dirFile);??
  • ??
  • ????????????if?(entry.isDirectory()){??
  • ????????????????dirFile.mkdirs();??
  • ????????????}?else?{??
  • ????????????decompressFile(dirFile,?zis);??
  • ????????????}??
  • ??
  • ????????????zis.closeEntry();??
  • ????}??
  • }??

  • 最核心的解壓縮實現,其實與壓縮實現非常相似,代碼如下所示:?
    Java代碼??
  • /**?
  • ?*?文件解壓縮?
  • ?*??
  • ?*?@param?destFile?
  • ?*????????????目標文件?
  • ?*?@param?zis?
  • ?*????????????ZipInputStream?
  • ?*?@throws?Exception?
  • ?*/??
  • private?static?void?decompressFile(File?destFile,?ZipInputStream?zis)??
  • ????????throws?Exception?{??
  • ??
  • ????BufferedOutputStream?bos?=?new?BufferedOutputStream(??
  • ????????????new?FileOutputStream(destFile));??
  • ??
  • ????int?count;??
  • ????byte?data[]?=?new?byte[BUFFER];??
  • ????while?((count?=?zis.read(data,?0,?BUFFER))?!=?-1)?{??
  • ????????bos.write(data,?0,?count);??
  • ????}??
  • ??
  • ????bos.close();??
  • }??

  • 來個完整的解壓縮實現,代碼如下:?
    Java代碼??
  • /**?
  • ?*?2010-4-12?
  • ?*/??
  • package?org.zlex.commons.io;??
  • ??
  • import?java.io.BufferedInputStream;??
  • import?java.io.BufferedOutputStream;??
  • import?java.io.File;??
  • import?java.io.FileInputStream;??
  • import?java.io.FileOutputStream;??
  • import?java.util.zip.CRC32;??
  • import?java.util.zip.CheckedInputStream;??
  • import?java.util.zip.CheckedOutputStream;??
  • import?java.util.zip.ZipEntry;??
  • import?java.util.zip.ZipInputStream;??
  • import?java.util.zip.ZipOutputStream;??
  • ??
  • /**?
  • ?*?ZIP壓縮工具?
  • ?*??
  • ?*?@author?梁棟????
  • ?*?@since?1.0?
  • ?*/??
  • public?class?ZipUtils?{??
  • ??
  • ????public?static?final?String?EXT?=?".zip";??
  • ????private?static?final?String?BASE_DIR?=?"";??
  • ????private?static?final?String?PATH?=?File.separator;??
  • ????private?static?final?int?BUFFER?=?1024;??
  • ??
  • ????/**?
  • ?????*?文件?解壓縮?
  • ?????*??
  • ?????*?@param?srcPath?
  • ?????*????????????源文件路徑?
  • ?????*??
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?decompress(String?srcPath)?throws?Exception?{??
  • ????????File?srcFile?=?new?File(srcPath);??
  • ??
  • ????????decompress(srcFile);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?解壓縮?
  • ?????*??
  • ?????*?@param?srcFile?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?decompress(File?srcFile)?throws?Exception?{??
  • ????????String?basePath?=?srcFile.getParent();??
  • ????????decompress(srcFile,?basePath);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?解壓縮?
  • ?????*??
  • ?????*?@param?srcFile?
  • ?????*?@param?destFile?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?decompress(File?srcFile,?File?destFile)?throws?Exception?{??
  • ??
  • ????????CheckedInputStream?cis?=?new?CheckedInputStream(new?FileInputStream(??
  • ????????????????srcFile),?new?CRC32());??
  • ??
  • ????????ZipInputStream?zis?=?new?ZipInputStream(cis);??
  • ??
  • ????????decompress(destFile,?zis);??
  • ??
  • ????????zis.close();??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?解壓縮?
  • ?????*??
  • ?????*?@param?srcFile?
  • ?????*?@param?destPath?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?decompress(File?srcFile,?String?destPath)??
  • ????????????throws?Exception?{??
  • ????????decompress(srcFile,?new?File(destPath));??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?文件?解壓縮?
  • ?????*??
  • ?????*?@param?srcPath?
  • ?????*????????????源文件路徑?
  • ?????*?@param?destPath?
  • ?????*????????????目標文件路徑?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?void?decompress(String?srcPath,?String?destPath)??
  • ????????????throws?Exception?{??
  • ??
  • ????????File?srcFile?=?new?File(srcPath);??
  • ????????decompress(srcFile,?destPath);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?文件?解壓縮?
  • ?????*??
  • ?????*?@param?destFile?
  • ?????*????????????目標文件?
  • ?????*?@param?zis?
  • ?????*????????????ZipInputStream?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????private?static?void?decompress(File?destFile,?ZipInputStream?zis)??
  • ????????????throws?Exception?{??
  • ??
  • ????????ZipEntry?entry?=?null;??
  • ????????while?((entry?=?zis.getNextEntry())?!=?null)?{??
  • ??
  • ????????????//?文件??
  • ????????????String?dir?=?destFile.getPath()?+?File.separator?+?entry.getName();??
  • ??
  • ????????????File?dirFile?=?new?File(dir);??
  • ??
  • ????????????//?文件檢查??
  • ????????????fileProber(dirFile);??
  • ??
  • ????????????if?(entry.isDirectory())?{??
  • ????????????????dirFile.mkdirs();??
  • ????????????}?else?{??
  • ????????????????decompressFile(dirFile,?zis);??
  • ????????????}??
  • ??
  • ????????????zis.closeEntry();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?文件探針?
  • ?????*??
  • ?????*??
  • ?????*?當父目錄不存在時,創建目錄!?
  • ?????*??
  • ?????*??
  • ?????*?@param?dirFile?
  • ?????*/??
  • ????private?static?void?fileProber(File?dirFile)?{??
  • ??
  • ????????File?parentFile?=?dirFile.getParentFile();??
  • ????????if?(!parentFile.exists())?{??
  • ??
  • ????????????//?遞歸尋找上級目錄??
  • ????????????fileProber(parentFile);??
  • ??
  • ????????????parentFile.mkdir();??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?文件解壓縮?
  • ?????*??
  • ?????*?@param?destFile?
  • ?????*????????????目標文件?
  • ?????*?@param?zis?
  • ?????*????????????ZipInputStream?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????private?static?void?decompressFile(File?destFile,?ZipInputStream?zis)??
  • ????????????throws?Exception?{??
  • ??
  • ????????BufferedOutputStream?bos?=?new?BufferedOutputStream(??
  • ????????????????new?FileOutputStream(destFile));??
  • ??
  • ????????int?count;??
  • ????????byte?data[]?=?new?byte[BUFFER];??
  • ????????while?((count?=?zis.read(data,?0,?BUFFER))?!=?-1)?{??
  • ????????????bos.write(data,?0,?count);??
  • ????????}??
  • ??
  • ????????bos.close();??
  • ????}??
  • ??
  • }??
  • 其實,理解了ZIP的工作原理,這些代碼看起來很好懂! ?
    把剛才做的壓縮文件再用上述代碼解開看看,測試用例如下:?
    Java代碼??
  • /**?
  • ?*?2010-4-12?
  • ?*/??
  • package?org.zlex.commons.io;??
  • ??
  • import?static?org.junit.Assert.*;??
  • ??
  • import?org.junit.Test;??
  • ??
  • /**?
  • ?*??
  • ?*?@author?梁棟?
  • ?*?@version?1.0?
  • ?*?@since?1.0?
  • ?*/??
  • public?class?ZipUtilsTest?{??
  • ??
  • ????/**?
  • ?????*???
  • ?????*/??
  • ????@Test??
  • ????public?void?test()?throws?Exception?{??
  • ????????//?解壓到指定目錄??
  • ????????ZipUtils.decompress("d:\\f.txt.zip",?"d:\\ff");??
  • ????????//?解壓到當前目錄??
  • ????????ZipUtils.decompress("d:\\fd.zip");??
  • ????}??
  • ??
  • }??
  • 完整代碼詳見附件!
    java原生的ZIP實現雖然在壓縮時會因與系統字符集不符產生中文亂碼,但在解壓縮后,字符集即可恢復。?

    除了java原生的ZIP實現外,commons和ant也提供了相應的ZIP算法實現,有機會我再一一介紹!


    • ZipUtils.rar?(2.1 KB)
    • 下載次數: 526


    總結

    以上是生活随笔為你收集整理的Java压缩技术(三) ZIP解压缩——Java原生实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线美女av | 欧美视频在线观看视频 | 亚洲色成人www永久网站 | 国产嫩草av | 欧美一级黄色片视频 | 最新中文字幕久久 | www.xxx在线观看 | 色多多污污| 天天干,天天操 | 韩日精品在线观看 | 狠狠久久| 开心激情亚洲 | 亚洲性生活 | 色视屏| jizz18国产| 天堂福利在线 | 午夜激情福利视频 | 天堂在线视频观看 | 波多野结衣在线免费视频 | 一炮成瘾1v1高h | 国产一区二区四区 | 色亚洲色图 | 国产18在线 | 午夜美女福利 | 2021天天干| 亚洲精品无码久久 | 男女扒开双腿猛进入爽爽免费 | 亚洲成人h | 国产精品2 | 向日葵视频在线 | 亚洲午夜小视频 | 久久麻豆精品 | 妓院一钑片免看黄大片 | 男人的天堂a在线 | 欧美青草视频 | 福利在线看 | 7777精品视频 | 中文字幕日韩精品无码内射 | 国产精品综合久久久 | 麻豆av免费观看 | 日日操日日干 | 亚洲精品免费在线播放 | 色综合天天网 | 久久亚洲精少妇毛片午夜无码 | 伊人成长网 | 久久久久久网 | 国产成人精品综合在线观看 | 另类亚洲色图 | 操视频网站 | 色屁屁www影院免费观看入口 | 亚洲jlzzjizz少妇 | 好吊视频一区二区三区四区 | 99re6在线精品视频免费播放 | 体内射精一区二区 | 99热超碰在线| 少妇捆绑紧缚av | 午夜精品福利一区二区三区蜜桃 | 亚洲第一天堂在线观看 | 女同hd系列中文字幕 | 性爱视频在线免费 | 国产毛片久久久久久国产毛片 | 99国产精 | 国产av不卡一区二区 | 日本v片 | 亚洲激情电影在线 | 国产亚洲区 | 亚洲成人h | 99在线观看免费视频 | 欧美日日夜夜 | 最近中文字幕 | 黄色免费视屏 | 国产激情精品一区二区三区 | 四虎视频国产精品免费入口 | 国产黄色视屏 | 欧洲天堂网 | 天堂av2018 | 老头巨大又粗又长xxxxx | 四虎4hu永久免费网站影院 | 又黄又爽又刺激的视频 | 亚洲先锋影音 | 久久99久久99精品中文字幕 | 天天射网站 | www.浪潮av.com | 色婷婷aⅴ一区二区三区 | 国产白浆一区二区 | 欧美人与性囗牲恔配 | 六月婷婷在线 | 男女插插视频 | 欧美三级视频网站 | 性视频在线 | 日韩精品欧美激情 | 国产欧美综合一区 | 自拍偷拍视频网站 | 人人舔人人 | 男生把女生困困的视频 | 国产最新精品视频 | 欧美亚洲精品在线观看 | 青青草狠狠操 | 全程粗话对白视频videos |