前言

其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载。
下载:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.util.Log;
public class DownLoaderTask extends AsyncTask<Void, Integer, Long> {
private final String TAG = "DownLoaderTask";
private URL mUrl;
private File mFile;
private ProgressDialog mDialog;
private int mProgress = 0;
private ProgressReportingOutputStream mOutputStream;
private Context mContext;
public DownLoaderTask(String url,String out,Context context){
super();
if(context!=null){
mDialog = new ProgressDialog(context);
mContext = context;
}
else{
mDialog = null;
}
try {
mUrl = new URL(url);
String fileName = new File(mUrl.getFile()).getName();
mFile = new File(out, fileName);
Log.d(TAG, "out="+out+", name="+fileName+",mUrl.getFile()="+mUrl.getFile());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
//super.onPreExecute();
if(mDialog!=null){
mDialog.setTitle("Downloading...");
mDialog.setMessage(mFile.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protected Long doInBackground(Void... params) {
// TODO Auto-generated method stub
return download();
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
//super.onProgressUpdate(values);
if(mDialog==null)
return;
if(values.length>1){
int contentLength = values[1];
if(contentLength==-1){
mDialog.setIndeterminate(true);
}
else{
mDialog.setMax(contentLength);
}
}
else{
mDialog.setProgress(values[0].intValue());
}
}
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
if(mDialog!=null&&mDialog.isShowing()){
mDialog.dismiss();
}
if(isCancelled())
return;
((MainActivity)mContext).showUnzipDialog();
}
private long download(){
URLConnection connection = null;
int bytesCopied = 0;
try {
connection = mUrl.openConnection();
int length = connection.getContentLength();
if(mFile.exists()&&length == mFile.length()){
Log.d(TAG, "file "+mFile.getName()+" already exits!!");
return 0l;
}
mOutputStream = new ProgressReportingOutputStream(mFile);
publishProgress(0,length);
bytesCopied =copy(connection.getInputStream(),mOutputStream);
if(bytesCopied!=length&&length!=-1){
Log.e(TAG, "Download incomplete bytesCopied="+bytesCopied+", length"+length);
}
mOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bytesCopied;
}
private int copy(InputStream input, OutputStream output){
byte[] buffer = new byte[1024*8];
BufferedInputStream in = new BufferedInputStream(input, 1024*8);
BufferedOutputStream out = new BufferedOutputStream(output, 1024*8);
int count =0,n=0;
try {
while((n=in.read(buffer, 0, 1024*8))!=-1){
out.write(buffer, 0, n);
count+=n;
}
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return count;
}
private final class ProgressReportingOutputStream extends FileOutputStream{
public ProgressReportingOutputStream(File file)
throws FileNotFoundException {
super(file);
// TODO Auto-generated constructor stub
}
@Override
public void write(byte[] buffer, int byteOffset, int byteCount)
throws IOException {
// TODO Auto-generated method stub
super.write(buffer, byteOffset, byteCount);
mProgress += byteCount;
publishProgress(mProgress);
}
}
}
解压:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.util.Log;
public class ZipExtractorTask extends AsyncTask<Void, Integer, Long> {
private final String TAG = "ZipExtractorTask";
private final File mInput;
private final File mOutput;
private final ProgressDialog mDialog;
private int mProgress = 0;
private final Context mContext;
private boolean mReplaceAll;
public ZipExtractorTask(String in, String out, Context context, boolean replaceAll){
super();
mInput = new File(in);
mOutput = new File(out);
if(!mOutput.exists()){
if(!mOutput.mkdirs()){
Log.e(TAG, "Failed to make directories:"+mOutput.getAbsolutePath());
}
}
if(context!=null){
mDialog = new ProgressDialog(context);
}
else{
mDialog = null;
}
mContext = context;
mReplaceAll = replaceAll;
}
@Override
protected Long doInBackground(Void... params) {
// TODO Auto-generated method stub
return unzip();
}
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
if(mDialog!=null&&mDialog.isShowing()){
mDialog.dismiss();
}
if(isCancelled())
return;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
//super.onPreExecute();
if(mDialog!=null){
mDialog.setTitle("Extracting");
mDialog.setMessage(mInput.getName());
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
cancel(true);
}
});
mDialog.show();
}
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
//super.onProgressUpdate(values);
if(mDialog==null)
return;
if(values.length>1){
int max=values[1];
mDialog.setMax(max);
}
else
mDialog.setProgress(values[0].intValue());
}
private long unzip(){
long extractedSize = 0L;
Enumeration<ZipEntry> entries;
ZipFile zip = null;
try {
zip = new ZipFile(mInput);
long uncompressedSize = getOriginalSize(zip);
publishProgress(0, (int) uncompressedSize);
entries = (Enumeration<ZipEntry>) zip.entries();
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
if(entry.isDirectory()){
continue;
}
File destination = new File(mOutput, entry.getName());
if(!destination.getParentFile().exists()){
Log.e(TAG, "make="+destination.getParentFile().getAbsolutePath());
destination.getParentFile().mkdirs();
}
if(destination.exists()&&mContext!=null&&!mReplaceAll){
}
ProgressReportingOutputStream outStream = new ProgressReportingOutputStream(destination);
extractedSize+=copy(zip.getInputStream(entry),outStream);
outStream.close();
}
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
zip.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return extractedSize;
}
private long getOriginalSize(ZipFile file){
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) file.entries();
long originalSize = 0l;
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
if(entry.getSize()>=0){
originalSize+=entry.getSize();
}
}
return originalSize;
}
private int copy(InputStream input, OutputStream output){
byte[] buffer = new byte[1024*8];
BufferedInputStream in = new BufferedInputStream(input, 1024*8);
BufferedOutputStream out = new BufferedOutputStream(output, 1024*8);
int count =0,n=0;
try {
while((n=in.read(buffer, 0, 1024*8))!=-1){
out.write(buffer, 0, n);
count+=n;
}
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return count;
}
private final class ProgressReportingOutputStream extends FileOutputStream{
public ProgressReportingOutputStream(File file)
throws FileNotFoundException {
super(file);
// TODO Auto-generated constructor stub
}
@Override
public void write(byte[] buffer, int byteOffset, int byteCount)
throws IOException {
// TODO Auto-generated method stub
super.write(buffer, byteOffset, byteCount);
mProgress += byteCount;
publishProgress(mProgress);
}
}
}
权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 创建和删除文件 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 写文件 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.READ_APN_SETTINGS" /> <uses-permission android:name="android.permission.RESTART_PACKAGES"/> <!-- 统计 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
源码下载:点击这里
总结
以上就是这篇文章的全部内容了,希望这篇文章对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对能带来一定的帮助。
# android
# 解压缩zip
# java
# 解压缩zip文件
# 文件解压缩
# Android中文件的压缩和解压缩实例代码
# Android如何实现压缩和解压缩文件
# Android编程实现将压缩数据库文件拷贝到安装目录的方法
# Android实现zip文件压缩及解压缩的方法
# android打开rar压缩文件
# Android实现文件或文件夹压缩成.zip格式压缩包
# 这篇文章
# 源码下载
# 在此
# 有很多
# 不多
# 点击这里
# 谢谢大家
# 在网上
# 有疑问
# fileName
# getFile
# context
# super
# null
# generated
# Auto
# TODO
# getName
# catch
# url
相关文章:
如何续费美橙建站之星域名及服务?
教学论文网站制作软件有哪些,写论文用什么软件
?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
简单实现Android文件上传
如何通过VPS搭建网站快速盈利?
南京网站制作费用,南京远驱官方网站?
如何通过老薛主机一键快速建站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
香港服务器选型指南:免备案配置与高效建站方案解析
如何快速打造个性化非模板自助建站?
如何用PHP快速搭建高效网站?分步指南
Android自定义控件实现温度旋转按钮效果
b2c电商网站制作流程,b2c水平综合的电商平台?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
linux top下的 minerd 木马清除方法
如何快速搭建高效可靠的建站解决方案?
建站之星如何配置系统实现高效建站?
建站之星logo尺寸如何设置最合适?
,柠檬视频怎样兑换vip?
香港服务器部署网站为何提示未备案?
建站主机如何选?性能与价格怎样平衡?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何在景安服务器上快速搭建个人网站?
如何在万网主机上快速搭建网站?
网站图片在线制作软件,怎么在图片上做链接?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
建站之星展会模版如何一键下载生成?
如何快速搭建个人网站并优化SEO?
如何彻底卸载建站之星软件?
如何获取PHP WAP自助建站系统源码?
如何在IIS中新建站点并配置端口与IP地址?
在线教育网站制作平台,山西立德教育官网?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
Python如何创建带属性的XML节点
如何用西部建站助手快速创建专业网站?
建站为何优先选择香港服务器?
公司网站制作价格怎么算,公司办个官网需要多少钱?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何用免费手机建站系统零基础打造专业网站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何用花生壳三步快速搭建专属网站?
如何在IIS中配置站点IP、端口及主机头?
定制建站哪家更专业可靠?推荐榜单揭晓
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
Android自定义listview布局实现上拉加载下拉刷新功能
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站之星客服服务时间及联系方式如何?
青岛网站建设如何选择本地服务器?
宁波自助建站系统如何快速打造专业企业网站?
重庆市网站制作公司,重庆招聘网站哪个好?
*请认真填写需求信息,我们会在24小时内与您取得联系。