Android实现下载zip压缩文件并解压的方法(附源码)
前言
其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载。
下载:
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.net.URLConnection;
importandroid.app.ProgressDialog;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.DialogInterface.OnCancelListener;
importandroid.os.AsyncTask;
importandroid.util.Log;
publicclassDownLoaderTaskextendsAsyncTask<Void,Integer,Long>{
privatefinalStringTAG="DownLoaderTask";
privateURLmUrl;
privateFilemFile;
privateProgressDialogmDialog;
privateintmProgress=0;
privateProgressReportingOutputStreammOutputStream;
privateContextmContext;
publicDownLoaderTask(Stringurl,Stringout,Contextcontext){
super();
if(context!=null){
mDialog=newProgressDialog(context);
mContext=context;
}
else{
mDialog=null;
}
try{
mUrl=newURL(url);
StringfileName=newFile(mUrl.getFile()).getName();
mFile=newFile(out,fileName);
Log.d(TAG,"out="+out+",name="+fileName+",mUrl.getFile()="+mUrl.getFile());
}catch(MalformedURLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
@Override
protectedvoidonPreExecute(){
//TODOAuto-generatedmethodstub
//super.onPreExecute();
if(mDialog!=null){
mDialog.setTitle("Downloading...");
mDialog.setMessage(mFile.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(newOnCancelListener(){
@Override
publicvoidonCancel(DialogInterfacedialog){
//TODOAuto-generatedmethodstub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protectedLongdoInBackground(Void...params){
//TODOAuto-generatedmethodstub
returndownload();
}
@Override
protectedvoidonProgressUpdate(Integer...values){
//TODOAuto-generatedmethodstub
//super.onProgressUpdate(values);
if(mDialog==null)
return;
if(values.length>1){
intcontentLength=values[1];
if(contentLength==-1){
mDialog.setIndeterminate(true);
}
else{
mDialog.setMax(contentLength);
}
}
else{
mDialog.setProgress(values[0].intValue());
}
}
@Override
protectedvoidonPostExecute(Longresult){
//TODOAuto-generatedmethodstub
//super.onPostExecute(result);
if(mDialog!=null&&mDialog.isShowing()){
mDialog.dismiss();
}
if(isCancelled())
return;
((MainActivity)mContext).showUnzipDialog();
}
privatelongdownload(){
URLConnectionconnection=null;
intbytesCopied=0;
try{
connection=mUrl.openConnection();
intlength=connection.getContentLength();
if(mFile.exists()&&length==mFile.length()){
Log.d(TAG,"file"+mFile.getName()+"alreadyexits!!");
return0l;
}
mOutputStream=newProgressReportingOutputStream(mFile);
publishProgress(0,length);
bytesCopied=copy(connection.getInputStream(),mOutputStream);
if(bytesCopied!=length&&length!=-1){
Log.e(TAG,"DownloadincompletebytesCopied="+bytesCopied+",length"+length);
}
mOutputStream.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnbytesCopied;
}
privateintcopy(InputStreaminput,OutputStreamoutput){
byte[]buffer=newbyte[1024*8];
BufferedInputStreamin=newBufferedInputStream(input,1024*8);
BufferedOutputStreamout=newBufferedOutputStream(output,1024*8);
intcount=0,n=0;
try{
while((n=in.read(buffer,0,1024*8))!=-1){
out.write(buffer,0,n);
count+=n;
}
out.flush();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
out.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
in.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returncount;
}
privatefinalclassProgressReportingOutputStreamextendsFileOutputStream{
publicProgressReportingOutputStream(Filefile)
throwsFileNotFoundException{
super(file);
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidwrite(byte[]buffer,intbyteOffset,intbyteCount)
throwsIOException{
//TODOAuto-generatedmethodstub
super.write(buffer,byteOffset,byteCount);
mProgress+=byteCount;
publishProgress(mProgress);
}
}
}
解压:
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Enumeration;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipException;
importjava.util.zip.ZipFile;
importandroid.app.ProgressDialog;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.DialogInterface.OnCancelListener;
importandroid.os.AsyncTask;
importandroid.util.Log;
publicclassZipExtractorTaskextendsAsyncTask<Void,Integer,Long>{
privatefinalStringTAG="ZipExtractorTask";
privatefinalFilemInput;
privatefinalFilemOutput;
privatefinalProgressDialogmDialog;
privateintmProgress=0;
privatefinalContextmContext;
privatebooleanmReplaceAll;
publicZipExtractorTask(Stringin,Stringout,Contextcontext,booleanreplaceAll){
super();
mInput=newFile(in);
mOutput=newFile(out);
if(!mOutput.exists()){
if(!mOutput.mkdirs()){
Log.e(TAG,"Failedtomakedirectories:"+mOutput.getAbsolutePath());
}
}
if(context!=null){
mDialog=newProgressDialog(context);
}
else{
mDialog=null;
}
mContext=context;
mReplaceAll=replaceAll;
}
@Override
protectedLongdoInBackground(Void...params){
//TODOAuto-generatedmethodstub
returnunzip();
}
@Override
protectedvoidonPostExecute(Longresult){
//TODOAuto-generatedmethodstub
//super.onPostExecute(result);
if(mDialog!=null&&mDialog.isShowing()){
mDialog.dismiss();
}
if(isCancelled())
return;
}
@Override
protectedvoidonPreExecute(){
//TODOAuto-generatedmethodstub
//super.onPreExecute();
if(mDialog!=null){
mDialog.setTitle("Extracting");
mDialog.setMessage(mInput.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(newOnCancelListener(){
@Override
publicvoidonCancel(DialogInterfacedialog){
//TODOAuto-generatedmethodstub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protectedvoidonProgressUpdate(Integer...values){
//TODOAuto-generatedmethodstub
//super.onProgressUpdate(values);
if(mDialog==null)
return;
if(values.length>1){
intmax=values[1];
mDialog.setMax(max);
}
else
mDialog.setProgress(values[0].intValue());
}
privatelongunzip(){
longextractedSize=0L;
Enumeration<ZipEntry>entries;
ZipFilezip=null;
try{
zip=newZipFile(mInput);
longuncompressedSize=getOriginalSize(zip);
publishProgress(0,(int)uncompressedSize);
entries=(Enumeration<ZipEntry>)zip.entries();
while(entries.hasMoreElements()){
ZipEntryentry=entries.nextElement();
if(entry.isDirectory()){
continue;
}
Filedestination=newFile(mOutput,entry.getName());
if(!destination.getParentFile().exists()){
Log.e(TAG,"make="+destination.getParentFile().getAbsolutePath());
destination.getParentFile().mkdirs();
}
if(destination.exists()&&mContext!=null&&!mReplaceAll){
}
ProgressReportingOutputStreamoutStream=newProgressReportingOutputStream(destination);
extractedSize+=copy(zip.getInputStream(entry),outStream);
outStream.close();
}
}catch(ZipExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
zip.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returnextractedSize;
}
privatelonggetOriginalSize(ZipFilefile){
Enumeration<ZipEntry>entries=(Enumeration<ZipEntry>)file.entries();
longoriginalSize=0l;
while(entries.hasMoreElements()){
ZipEntryentry=entries.nextElement();
if(entry.getSize()>=0){
originalSize+=entry.getSize();
}
}
returnoriginalSize;
}
privateintcopy(InputStreaminput,OutputStreamoutput){
byte[]buffer=newbyte[1024*8];
BufferedInputStreamin=newBufferedInputStream(input,1024*8);
BufferedOutputStreamout=newBufferedOutputStream(output,1024*8);
intcount=0,n=0;
try{
while((n=in.read(buffer,0,1024*8))!=-1){
out.write(buffer,0,n);
count+=n;
}
out.flush();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
out.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
in.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returncount;
}
privatefinalclassProgressReportingOutputStreamextendsFileOutputStream{
publicProgressReportingOutputStream(Filefile)
throwsFileNotFoundException{
super(file);
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidwrite(byte[]buffer,intbyteOffset,intbyteCount)
throwsIOException{
//TODOAuto-generatedmethodstub
super.write(buffer,byteOffset,byteCount);
mProgress+=byteCount;
publishProgress(mProgress);
}
}
}
权限:
<uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <!--创建和删除文件--> <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!--写文件--> <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <uses-permissionandroid:name="android.permission.VIBRATE"/> <uses-permissionandroid:name="android.permission.READ_APN_SETTINGS"/> <uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/> <!--统计--> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <uses-permissionandroid:name="android.permission.READ_LOGS"/> <uses-permissionandroid:name="android.permission.WAKE_LOCK"/> <uses-permissionandroid:name="android.permission.CHANGE_CONFIGURATION"/>
源码下载:点击这里
总结
以上就是这篇文章的全部内容了,希望这篇文章对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票能带来一定的帮助。