Android下文件的壓縮和解壓(Zip格式)


Zip文件結構

ZIP文件結構如下圖所示, File Entry表示一個文件實體,一個壓縮文件中有多個文件實體。

文件實體由一個頭部和文件數據組,Central Directory由多個File header組成,每個File header都保存一個文件實體的偏移,文件最后由End of central directory結束。

用到的類

ZipFile

此類用於從 ZIP 文件讀取條目ZipEntry,在解壓時用到

ZipEntry

此類用於表示 ZIP 文件條目

ZipOutputStream

此類為以 ZIP 文件格式寫入文件實現輸出流過濾器

Enumeration

實現 Enumeration 接口的對象,它生成一系列元素,一次生成一個。連續調用 nextElement 方法將返回一系列的連續元素,在解壓縮時會用到

CheckedOutputStream

需要維護寫入數據校驗和的輸出流。校驗和可用於驗證輸出數據的完整性。

CRC32

可用於計算數據流的 CRC-32 的類

壓縮流程

首先要封裝出一個ZipOutputStream: 

ZipOutputStream zipOutputStream = new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(file),new CRC32()));

 

有了ZipOutputStream后,要壓縮一個文件,就先在輸出流加入一個ZipEntry,然后獲取需要壓縮的文件輸入流,然后再輸出:

注意最后要刷新和關閉輸出流

zipOutputStream.flush(); zipOutputStream.close();

當然這只是單個文件的壓縮,我們壓縮文件時經常會壓縮整個文件夾,所以還需要遍歷整個文檔,針對目錄和文件分別作出判斷:

if (fileSrc.isDirectory()) { File[] files = fileSrc.listFiles(); name = name+"/"; zipOutputStream.putNextEntry(new ZipEntry(name)); // 建一個文件夾 System.out.println("目錄名: "+name); for (File f : files) { zip(zipOutputStream,name+f.getName(),f); System.out.println("目錄: "+name+f.getName()); } }

 

解壓縮流程

解壓縮就是壓縮的逆過程,其過程就是從壓縮文件中獲取ZipEntry,獲取其輸入流,將其輸出到指定位置:

這也是單個文件的解壓縮,解壓縮文件夾只需遍歷ZipFile,判斷ZipEntry是目錄還是文件,具體操作不再詳解,可到文末的源碼中查看。

END

本文參考: 
Android 解壓zip文件你知道多少?

源碼: 
https://github.com/xiaoniu/AndroidZipFile


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM