您的位置:首页 > 理论基础 > 计算机网络

文件下载

2013-07-02 13:40 183 查看
传统的文件下载

  先来说一种简单地、传统的方式,即采用流的方式下载文件,步骤如下:

  建一个HttpURLConnection的对象,可以通过URL对象的openConnection()方法获取,例如:HttpURLConnection urlConn = (HttpURLConnection)url.openconnection();

  获取一个InputStream对象:urlConn.getInputStream()。有了InputStream,剩下的都是Java的标准I/O操作。

  示例代码如下:

int data = 0;
//目标文件地址为SD卡根目录,文件名为baidu.jpg
File file = new File(Environment.getExternalStorageDirectory(),"baidu.jpg");
//输出流地址
FileOutputStream fos = new FileOutputStream(file);
URL url = new URL("http://www.baidu.com/img/bdlogo.gif");
//开始请求
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//状态码。一般检测是否为200,如果是则继续。此处省略代码。
Log.i("code",""+urlConn.getResponseCode());
//获取输入流
InputStream is = urlConn.getInputStream();
//一个字节一个字节地写入,如果读取完毕,返回-1,while终止
while( (data=is.read())!=-1 ){
fos.write(data);
}
fos.flush();
fos.close();

  记得在Androidmanifest.xml添加以下权限(网络权限/SD卡读写权限)

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application>
....
</application>


使用DownloadManager管理下载

  在Android 2.3引入了DownloadManager可以处理复杂的文件下载,包括检查用户是否有数据联系(WIFI或者移动数据),当用户从一个有数据连接的地方移动到无连接的地方(例如离开了wifi或者3G data的access point),确保设备在下载过程中保持awake状态。DownloadManager可以处理HTTP URLs,但是不能处理HTTPS(SSL) URLs。注意,由于不支持2.3之前的版本,因此该功能只能在2.3或者更高版本的API上使用。

  第一步,不要忘记在Androidmanifest.xml中添加权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application>
....
</application>
  java源码如下,所有解释均在注释中体现:

long lastDownloadId = 0;
// 步骤1 : 获取系统服务,并指明是下载服务,即DownloadManager。
DownloadManager mgr = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
//注意,这个Uri是android.net.Uri,而不是java.net.URI
Uri uri = Uri.parse("http://www.baidu.com/img/bdlogo.gif");
//步骤2: 通过向下载服务发出enqueue()的请求,将放在下载队列中,通常会触发立即下载,并返回下载的ID号
//根据这个号,可以查询相关的下载情况。分别设置请求的Uri,允许的数据访问方式,是否允许漫游,本地存储的位置,以及为这个下载设置title和描述信息。
lastDownloadId = mgr.enqueue(new DownloadManager.Request(uri)
//可在移动网络和WIFI情况下下载。注意使用的是位运算符
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI)
//缺省是true,true的情况下若是漫游也同样下载
.setAllowedOverRoaming(false)
//下载任务的标题
.setTitle("MyTest")
//下载任务的小标题
.setDescription("Something Useful")
//第一个参数为路径,默认路径"/"即为SD卡根目录;第二个参数为目标文件名
.setDestinationInExternalPublicDir("/", "baidu111.gif"));




  注意,对于任何的Internet访问都不建议在主线程中进行。否则会导致5秒卡死(Android程序若主程序在五秒钟内仍没有响应,就会被认为是卡死,请求退出)。

以上部分内容转载或参考来源如下:

http://blog.csdn.net/flowingflying/article/details/6925683

在此表示感谢。

转载请注明来源,版权归原作者所有,未经同意严禁用于任何商业用途。

微博:http://weibo.com/theworldsong

邮箱:theworldsong@foxmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息