Android中文件的壓縮和解壓縮實(shí)例代碼
使用場(chǎng)景
當(dāng)我們?cè)趹?yīng)用的Assets目錄中需要加入文件時(shí),可以直接將源文件放入,但這樣會(huì)造成打包后的apk整體過(guò)大,此時(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();
}
}
}
}
上述代碼存在問(wèn)題,若文件壓縮后仍然很大怎么辦,換句話說(shuō)文件壓縮率低也是問(wèn)題,java中也專門對(duì)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í)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android上傳文件到Web服務(wù)器 PHP接收文件
這篇文章主要為大家詳細(xì)介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android拍照保存在系統(tǒng)相冊(cè)不顯示的問(wèn)題解決方法
我們保存相冊(cè)到Android手機(jī)的時(shí)候,然后去打開系統(tǒng)圖庫(kù)找不到我們想要的那張圖片,那是因?yàn)槲覀儾迦氲膱D片還沒(méi)有更新的緣故,下面與大家分享下此問(wèn)題的解決方法2013-06-06
Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果
這篇文章主要介紹了Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果,涉及Android圖形繪制及顯示的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解
這篇文章主要為大家介紹了Android客戶端與服務(wù)端數(shù)據(jù)加密傳輸方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android GSYVideoPlayer視頻播放器功能的實(shí)現(xiàn)
這篇文章主要介紹了Android GSYVideoPlayer視頻播放器功能的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
詳解Android Service 使用時(shí)的注意事項(xiàng)
這篇文章主要介紹了詳解Android Service 使用時(shí)的注意事項(xiàng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10

