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

轉載于:https://www.cnblogs.com/fuyaozhishang/p/9282101.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397550.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速理解和使用 ES7 await/async

await/async 是 ES7 最重要特性之一,它是目前為止 JS 最佳的異步解決方案了。雖然沒有在 ES2016 中錄入,但很快就到來,目前已經在 ES-Next Stage 4 階段。 直接上例子,比如我們需要按順序獲取:產品數據>用戶數據>…

jdeveloper優化:

D:\jdevstudio10133\jdev\bin\jdev.conf末尾加上下面的AddVMOption -Dsun.java2d.noddrawtrueAddVMOption -Dsun.java2d.ddoffscreenfalse 轉載于:https://www.cnblogs.com/sprinng/p/4780112.html

linux make java版本,告訴make是否在Windows或Linux上運行

更新請閱讀這個類似但更好的答案:https://stackoverflow.com/a/14777895/938111make (和 gcc )可以使用Cygwin或MinGW在MS-Windows上輕松安裝 .正如ldigas所說, make 可以使用 UNAME:$(shell uname) 檢測平臺(命令 uname 也由Cygwin或MinGW安…

MPI多機器實現并行計算

最近使用一個系統的分布式版本搭建測試環境,該系統是基于MPI實現的并行計算,MPI是傳統基于msg的系統,這個框架非常靈活,對程序的結構沒有太多約束,高效實用簡單,下面是MPI在多臺機器上實現并行計算的過程。…

Jenkins_獲取源碼編譯并啟動服務(二)

一、創建Maven項目二、設置SVN信息三、設置構建觸發器四、設置Maven命令五、設置構建后發郵件信息(參考文章一)六、設置構建后拷貝文件到遠程機器并執行命令來自為知筆記(Wiz)

php 判斷頁面加載完,所有ajax執行完且頁面加載完判斷

jquery ajax&load 方法導致 js效果不顯示或顯示后由于加載后ajax 重新布局頁面導致效果錯誤。解決思路:需要在ajax get post 或 load 等執行完后再去執行方法就不會由于他們沒執行完導致的最終錯誤。那么首先看load 方法定義:jQuery ajax - load() 方…

正確理解ThreadLocal

想必很多朋友對 ThreadLocal并不陌生,今天我們就來一起探討下ThreadLocal的使用方法和實現原理。首先,本文先談一下對ThreadLocal的理 解,然后根據ThreadLocal類的源碼分析了其實現原理和使用需要注意的地方,最后給出了兩個應用場…

2018.7.10 個人博客文章=利用ORM創建分類和ORM的內置函數

昨天的注冊收尾工作 其實就差了和MySql聯系起來的部分,這部分很簡單,首先要做的就是保存用戶通過from傳送過來的頭像文件: """ 保存頭像文件 """ file request.FILES.get(avatar) file_path os.path.join(st…

python 列表與元組的操作簡介

上一篇:Python 序列通用操作介紹 列表 列表是可變的(mutable)——可以改變列表的內容,這不同于字符串和元組,字符串和元組都是不可變的。接下來討論一下列表所提供的方法。 list函數 可以使用list函數來創建列表: list(Hello) [H,…

mfc嵌入matlab繪圖窗口,將matlab的圖嵌入MFC

【實例簡介】VS調用matlab畫圖模塊編譯成的動態鏈接庫,并在MFC顯示。【實例截圖】【核心代碼】3b0582a3-4ea8-4a61-ba33-e448be563b88└── 將matlab的圖嵌入MFC├── matlab_2010b與VS2008_混合編程的實現.pdf├── TestWithData│ ├── Debug│ │ ├─…

python multiprocessing 和tcp

#用類方法 服務端from socket import *from multiprocessing import Processimport osclass Myprocess(Process): def __init__(self, conn): self.conn conn super().__init__() def run(self): conn self.conn start True whil…

matlab 畫三維花瓶,精美花瓶建模教程

1、首先,草圖單位為mm,進入前視圖繪制如圖草圖,花瓶的基本形狀輪廓2、然后對草圖進行旋轉3、旋轉出曲面后,在頂部邊線新建一個基準面4、繼續在前視圖繪制草圖,如圖繪制一弧線5、然后進行旋轉6、可以得到圖示的兩個曲面…

PKI系統相關知識點介紹

公鑰基礎設施(Public Key Infrastructure,簡稱PKI)是目前網絡安全建設的基礎與核心,是電子商務安全實施的基本保障,因此,對PKI技術的研究和開發成為目前信息安全領域的熱點。本文對PKI技術進行了全面的分析…

android 打印java堆棧,Android打印堆棧

java打印堆棧方法一:異常對象打印堆棧Exception e new Exception("this is a log");e.printStackTrace();方法二:Log打印獲取異常的堆棧并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C\C打印堆棧方法一:…

實際算法項目工程上手日志C/C++

#pragma once 為了保證頭文件只被編譯一次,通常放在頭文件的頂部 #define IN #define OUT #define INOUT 這個只在邏輯上起作用, IN 表示輸入參數,指針指向的值不會修改; OUT 表示輸出參數,指針指向的值會修改&a…

Arduino 控制超聲波測距模塊

一.實物圖 二.例子代碼 用到數字2 和3 引腳,還有兩個就是vcc GND兩個陰腳,用模塊連線比較簡單 轉載于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安裝source-code-pro字體

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載source-code-pro字體 從GitHub下載 https://github.com/adobe-fonts/source-code-pro/releases 2.解壓文件,將OTF格式的文件夾重新命名一下,這里我命名為source-code-pro,然后將…

dft對稱性 matlab實驗,數字信號處理實驗指導書(審)

(0???2?)上對X(ej?)均勻采樣得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是頻域上的有限長序列,長度為N。序列X(k)稱為序列x(n)的N點DFT。N稱為DFT變換區間長度。 通常表示WN?e?j2?/N可將定義式表示為?X(k)??x(n)…

PI

并不是所有東西都可以套PI的,只有滿足上述這類的數學關系才可以。 轉速經過PI調節得到電流也是有原因的。從下圖中可以發現,轉速 k*Iq/s,s是拉普拉斯算子,所以也是滿足積分,比例關系的。 轉載于:https://www.cnblogs.…

AOP之AspectJ簡單使用

為什么80%的碼農都做不了架構師?>>> 參考文章: 使用AspectJ在Android中實現Aop 深入理解Android之AOP自動打印日志主要知識點: 主要是JPoint、pointcuts、advice以及他們之間的關系可以通過aj文件、或AspectJ注解的Java文件實現A…