Android中文件的壓縮和解壓縮實(shí)例代碼
使用場景
當(dāng)我們在應(yīng)用的Assets目錄中需要加入文件時(shí),可以直接將源文件放入,但這樣會(huì)造成打包后的apk整體過大,此時(shí)就需要將放入的文件進(jìn)行壓縮.又如當(dāng)我們需要從服務(wù)器中下載文件時(shí),如果下載源文件耗時(shí)又消耗流量,較大文件需要壓縮,可以使得傳輸效率大大提高.下面我們就學(xué)習(xí)下基本的文件壓縮和解壓縮.Java中提供了壓縮和解壓縮的輸入輸出流
public static void zip(String src,String dest) throwsIOException {
//定義壓縮輸出流
ZipOutputStreamout = null;
try {
//傳入源文件
File outFile= newFile(dest);
File fileOrDirectory= newFile(src);
//傳入壓縮輸出流
out = newZipOutputStream(newFileOutputStream(outFile));
//判斷是否是一個(gè)文件或目錄
//如果是文件則壓縮
if (fileOrDirectory.isFile()){
zipFileOrDirectory(out,fileOrDirectory, "");
} else {
//否則列出目錄中的所有文件遞歸進(jìn)行壓縮
File[]entries = fileOrDirectory.listFiles();
for (int i= 0; i < entries.length;i++) {
zipFileOrDirectory(out,entries,"");
}
}
}catch(IOException ex) {
ex.printStackTrace();
}finally{
if (out!= null){
try {
out.close();
}catch(IOException ex) {
ex.printStackTrace();
}
}
}
}
private static void zipFileOrDirectory(ZipOutputStream out, File fileOrDirectory, String curPath)throwsIOException {
FileInputStreamin = null;
try {
//判斷目錄是否為null
if (!fileOrDirectory.isDirectory()){
byte[] buffer= new byte[4096];
int bytes_read;
in= newFileInputStream(fileOrDirectory);
//歸檔壓縮目錄
ZipEntryentry = newZipEntry(curPath + fileOrDirectory.getName());
//將壓縮目錄寫到輸出流中
out.putNextEntry(entry);
while ((bytes_read= in.read(buffer))!= -1) {
out.write(buffer,0, bytes_read);
}
out.closeEntry();
} else {
//列出目錄中的所有文件
File[]entries = fileOrDirectory.listFiles();
for (int i= 0; i < entries.length;i++) {
//遞歸壓縮
zipFileOrDirectory(out,entries,curPath + fileOrDirectory.getName()+ "/");
}
}
}catch(IOException ex) {
ex.printStackTrace();
}finally{
if (in!= null){
try {
in.close();
}catch(IOException ex) {
ex.printStackTrace();
}
}
}
}
上述代碼存在問題,若文件壓縮后仍然很大怎么辦,換句話說文件壓縮率低也是問題,java中也專門對Linux提供了高壓縮率的輸入輸出流,其使用方法和上述代碼相似.高壓縮率輸入輸出流:(GZIPInputStream和GZIPOutputStream)
文件壓縮
public static void zip(File srcFile, File desFile)throwsIOException {
GZIPOutputStreamzos = null;
FileInputStreamfis = null;
try {
//創(chuàng)建壓縮輸出流,將目標(biāo)文件傳入
zos = newGZIPOutputStream(newFileOutputStream(desFile));
//創(chuàng)建文件輸入流,將源文件傳入
fis = newFileInputStream(srcFile);
byte[] buffer= new byte[1024];
int len= -1;
//利用IO流寫入寫出的形式將源文件寫入到目標(biāo)文件中進(jìn)行壓縮
while ((len= (fis.read(buffer)))!= -1) {
zos.write(buffer,0, len);
}
}finally{
close(zos);
close(fis);
}
}
文件解壓縮
public static void unZip(File srcFile,File desFile) throws IOException {
GZIPInputStream zis= null;
FileOutputStreamfos = null;
try {
//創(chuàng)建壓縮輸入流,傳入源文件
zis = new GZIPInputStream(newFileInputStream(srcFile));
//創(chuàng)建文件輸出流,傳入目標(biāo)文件
fos = newFileOutputStream(desFile);
byte[] buffer= new byte[1024];
int len= -1;
//利用IO流寫入寫出的形式將壓縮源文件解壓到目標(biāo)文件中
while ((len= (zis.read(buffer)))!= -1) {
fos.write(buffer,0, len);
}
}finally{
close(zis);
close(fos);
}
}
以上所述是小編給大家介紹的Android中文件的壓縮和解壓縮實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android實(shí)現(xiàn)點(diǎn)擊兩次BACK鍵退出應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)點(diǎn)擊兩次BACK鍵退出應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android實(shí)現(xiàn)點(diǎn)匯聚成字的動(dòng)態(tài)效果詳解
在引入?fl_chart?繪制圖表的時(shí)候,看到插件有下面這樣的動(dòng)效,隨機(jī)散亂的圓點(diǎn)最后組合成了?Flutter?的?Logo,挺酷炫的。本篇我們來探討類似的效果怎么實(shí)現(xiàn)2022-07-07
android-獲取網(wǎng)絡(luò)時(shí)間、獲取特定時(shí)區(qū)時(shí)間、時(shí)間同步的方法
本篇文章主要介紹了android-獲取網(wǎng)絡(luò)時(shí)間、獲取特定時(shí)區(qū)時(shí)間、時(shí)間同步,小編覺得不錯(cuò),現(xiàn)在就分享給大家,有興趣的可以了解一下。2016-12-12
Android Messenger實(shí)現(xiàn)進(jìn)程間雙向通信
這篇文章主要為大家詳細(xì)介紹了Messenger實(shí)現(xiàn)進(jìn)程間雙向通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Android json數(shù)據(jù)解析詳解及實(shí)例代碼
這篇文章主要介紹了 Android json數(shù)據(jù)解析詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android常用命令集錦(圖文并茂適應(yīng)于初學(xué)者)
大家好,今天我們要講的是android開發(fā)中,比較常用的名令集錦, 在我們開發(fā)中難免用到Android命令,有些確實(shí)命令確實(shí)很有用處,這也是我為什么總結(jié)這篇文章的原因了,希望對大家有所幫助2013-01-01
android webview 中l(wèi)ocalStorage無效的解決方法
這篇文章主要介紹了android webview 中l(wèi)ocalStorage無效的解決方法,本文直接給出解決方法實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
詳解Android studio ndk配置cmake開發(fā)native C
這篇文章主要介紹了詳解Android studio ndk配置cmake開發(fā)native C,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09

