Android中如何实现文件下载

   

最近做一个项目需要从服务器下载图片到本地sdcard,上网查找了一些例子,下面这个比较合适,原文内容如下:

我们在开发中经常需要从服务器下载文件,下载的内容可能有交换的信息,缓存的图片,程序更新包等。我们使用URLConnection来实现下载。先看几行代码:

String urlDownload = "";

urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif";

URL url = new URL(urlDownload );

// 打开连接

URLConnection con = url.openConnection();

// 输入流

InputStream is = con.getInputStream();

如上面的代码所示,指定一个下载的目标链接,我们上面指定了一个图片地址。然后构建一个URL对象,调用该 对象的openConnection方法来建立一个数据通路(连接)。代码的最后一行使用 con.getInputStream,拿到一个输入流对象,通过这个流对象我们就可以读取到这个文件的内容了。下面要做的,就是读取这个流,将流写入我 们的本地文件。不过在这之前,我们还要说下这个方法:

<span xmlns="http://www.w3.org/1999/xhtml">//获得文件的长度

int contentLength = con.getContentLength();

System.out.println("长度 :"+contentLength)</span>

获得文件长度的方法。ContentLength是不很熟啊。它是http协议里描述头(head)部分的描述属性之一。实际这里是发送了一个http请求,分析了返回(response)里数据内容。

 

我们常常会把文件下载到手机的存储卡里,所以还会用到获得存储卡路径的方法:

<span xmlns="http://www.w3.org/1999/xhtml">// 获得存储卡路径,构成 保存文件的目标路径

String dirName = "";

dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";

File f = new File(dirName);

if(!f.exists())

{

f.mkdir();

}</span>

Environment.getExternalStorageDirectory() 方法会返回一个字符串,指示了存储卡的路径。我们拼接字符串出一个准备存放下载文件的文件夹。并先判断文件夹是是否存在,如果不存在,则新建一个文件夹。

 

做完了上面的准备后,基本就能实现下载了。我们看看主要的完整代码。

 

下载前的准备工作:

//要下载的文件路径

String urlDownload = "";

//urlDownload =  "http://192.168.3.39/text.txt";

urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif";

// 获得存储卡路径,构成 保存文件的目标路径

String dirName = "";

dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";

File f = new File(dirName);

if(!f.exists())

{

f.mkdir();

}

下载的操作:

//准备拼接新的文件名(保存在存储卡后的文件名)

String newFilename = _urlStr.substring(_urlStr.lastIndexOf("/")+1);

newFilename = _dirName + newFilename;

File file = new File(newFilename);

//如果目标文件已经存在,则删除。产生覆盖旧文件的效果

if(file.exists())

{

file.delete();

}

try {

// 构造URL

URL url = new URL(_urlStr);

// 打开连接

URLConnection con = url.openConnection();

//获得文件的长度

int contentLength = con.getContentLength();

System.out.println("长度 :"+contentLength);

// 输入流

InputStream is = con.getInputStream();

// 1K的数据缓冲

byte[] bs = new byte[1024];

// 读取到的数据长度

int len;

// 输出的文件流

OutputStream os = new FileOutputStream(newFilename);

// 开始读取

while ((len = is.read(bs)) != -1) {

os.write(bs, 0, len);

}

// 完毕,关闭所有链接

os.close();

is.close();

} catch (Exception e) {

e.printStackTrace();

}

转自:http://www.itivy.com/android/archive/2011/6/28/android-file-download.html

我的部分代码如下:

//从服务器下载图片到本地

private void getPhotoFromServer(List<Advert> adverts){

//读取服务器ip地址

String serverip = NetworkUtil.getDns(); //直接读取服务器的ip地址

//String serverURL = serverURLAll.substring(serverURLAll.indexOf(":")+3, serverURLAll.lastIndexOf(":")); //最好还是直接从数据库或者其他地方读取ip地址

Log.d(TAG, "server ip is " + serverip);

//整合成完整的广告图片存放地址目录

String urlDownload = "http://" + serverip +":8080/proPicRecord/";

//广告图片本地sd卡存放目录

String dirName = "/sdcard/advert/";

//判断本地存放广告图片的目录是否存,不存在则新建文件夹

File f = new File(dirName);

if(!f.exists())

{

f.mkdir();

}

//服务器上广告图片完整路径名,供下载用

String urlDownloadAll = "";

//准备拼接新的文件名(保存在存储卡后的文件名)

for(int i=0; adverts!=null && i<adverts.size(); i++){

Advert advert = adverts.get(i);

//下载路径添加上广告图片名字

urlDownloadAll = urlDownload + advert.getUrl();

Log.d(TAG, "The whole server download url is " + urlDownloadAll);

//获取广告图片的名字,其实使用advert.getUrl()也可

String newFilename = urlDownloadAll.substring(urlDownloadAll.lastIndexOf("/")+1);

//本地播放广告图片的完整路径

newFilename = dirName + newFilename;

Log.d(TAG, "The local url is" + newFilename);

File file = new File(newFilename);

//如果目标文件已经存在,则删除,产生覆盖旧文件的效果(此处以后可以扩展为已经存在图片不再重新下载功能)

if(file.exists())

{

file.delete();

}

try{

//构造URL

URL url = new URL(urlDownloadAll);

//打开连接

URLConnection con = url.openConnection();

//获得文件的长度

//int contentLength = con.getContentLength();

//System.out.println("长度 :"+contentLength);

//输入流

InputStream is = con.getInputStream();

//1K的数据缓冲

byte[] bs = new byte[1024];

//读取到的数据长度

int len;

//输出的文件流

OutputStream os = new FileOutputStream(newFilename);

//开始读取

while ((len = is.read(bs)) != -1) {

os.write(bs, 0, len);

}

//完毕,关闭所有链接

os.close();

is.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

Android中如何实现文件下载,布布扣,bubuko.com

时间: 2024-12-16 13:14:14

Android中如何实现文件下载的相关文章

使用IntentService给自己的Android应用写一个文件下载器。

接着上一篇的http://www.cnblogs.com/zhengxt/p/3657833.html,当我们想给自己的APP写一个文件下载器时,可以用重写IntentService来实现. 使用IntentService有几个好处,IntentService继承于Service,适合拿来处理一些耗时又不需要去管它的任务.把要执行的任务用Intent加入到队列中,IntentService会有一个工作线程来取出队列中的Intent来处理.需要实现抽象方法onHandleIntent方法来执行这些

Android中AsyncTask使用具体解释

在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handler在收到该Message之后就能够进行更新UI的操作.上述场景中须要分别在Thread和Handler中编写代码逻辑,为了使得代码更加统一,我们能够使用AsyncTask类. AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用. Andro

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

关于android中事件传递和分发的一些小理解

android中 当我们的手指触摸屏幕将产生一个事件, (假设 这个过程中如果没有显示的去拦截该事件的话)   这个事件会逐级传递到视图的最底层,即使在中间某些视图会响应这个事件( 这个视图也不会去消费这个事件),     仍然是会传递到底层(底层不响应该事件),然后再由底层回传到顶层,在传回顶层的过程中 ,   原先会响应该事件的视图才会去消费这个事件 例如在左图中                                 A                               

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

Android中监听ListView滑动到底部

Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,可能我们需要触发点什么事件,比如加载更多.隐藏某个控件等等. 第一种方法是直接滑动到底部就触发 listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollS

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们