日韩性视频-久久久蜜桃-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| 狠狠干天天干 | 私密按摩massagexxx | 理论在线视频 | 欧美色综合网站 | 免费看女人裸体 | 国产一级片a | 亚洲AV不卡无码一区二区三区 | 亚洲免费视频播放 | 欧美性欧美zzzzzzzzz | 日韩国产一区二区三区 | 可以免费看的av网站 | 九九免费视频 | 国产欧美在线观看视频 | 中国女人内谢69xxxxⅹ视频 | 亚洲综合精品国产一区二区三区 | 日韩精品一区二区三区免费视频 | 亚洲色图少妇 | 亚洲成人毛片 | 欧美一区二区视频在线 | 国产免费麻豆 | 色老妹 | 秘密爱大尺度做爰呻吟 | 色妞综合 | 亚洲成人一区在线观看 | 中文字幕一区二区三区四区欧美 | 久久久精品中文字幕 | 岛国av中文字幕 | 午夜免费看 | 日韩经典中文字幕 | 国产日韩片| 最近中文字幕免费mv视频7 | v片在线观看 | 日韩欧美中出 | 国产精品二区视频 | 69视频在线 | 日本中文字幕在线视频 | 日韩区欧美区 | 色妞网| 国产精品一卡 | 国产精品影院在线观看 | 日韩视频免费在线播放 | 一区二区三区视频在线 | 亚洲男人精品 | 亚洲国产日韩一区二区 | 天天操天天操天天操天天操 | 日韩欧美中出 | 国产精品福利小视频 | 欧美日韩一区二区不卡 | 亚洲精品日产精品乱码不卡 | 日韩免费视频一区二区视频在线观看 | 国产精品污www一区二区三区 | 欧美高清v | 国产毛片一区 | 李丽珍毛片 | 成人免费看片'在线观看 | free性中国hd国语露脸 | 91这里只有精品 | 小镇姑娘1979版 | 中文字幕av无码一区二区三区 | 97人人爽人人爽人人爽 | 日韩激情图片 | 中文日韩av | 97色干 | 日韩videos | 侵犯女教师一区二区三区 | 日女人网站 | 亚洲综合套图 | 国产成人精品二区三区亚瑟 | 国产午夜精品久久久久久久 | 国产一级一片 | 92久久精品一区二区 | 日韩视频播放 | 久久久久毛片 | 欧美人妻精品一区二区 | 超碰97国产 | 中文av免费观看 | 亚洲乱熟女一区二区三区小说 | 综合色婷婷一区二区亚洲欧美国产 | 国产精品三级在线观看无码 | 99精品视频在线 | 成人高清视频免费观看 | 国产精品粉嫩 | 西西人体大胆4444ww张筱雨 | 久久综合激情网 | 国产传媒视频在线 | 深爱五月激情五月 | 国产精品夜夜躁视频 | 久久涩视频 | 草草影院第一页 | 欧美性福利 | 91网站免费观看 | 我和单位漂亮少妇激情 | 日本美女操 | 毛片视频在线免费观看 | 日av一区 | 日大逼 | 国产精品久久久久久人 | 国产成人黄色 |