android文件下载功能实现,Android文件下载功能实现代码

本文实例为大家分享了Android文件下载功能的具体代码,供大家参考,具体内容如下

1.普通单线程下载文件:

直接使用URLConnection.openStream()打开网络输入流,然后将流写入到文件中!

public static void downLoad(String path,Context context)throws Exception

{

URL url = new URL(path);

InputStream is = url.openStream();

//截取最后的文件名

String end = path.substring(path.lastIndexOf("."));

//打开手机对应的输出流,输出到文件中

OutputStream os = context.openFileOutput("Cache_"+System.currentTimeMillis()+end, Context.MODE_PRIVATE);

byte[] buffer = new byte[1024];

int len = 0;

//从输入六中读取数据,读到缓冲区中

while((len = is.read(buffer)) > 0)

{

os.write(buffer,0,len);

}

//关闭输入输出流

is.close();

os.close();

}

2.普通多线程下载:

步骤:

获取网络连接

本地磁盘创建相同大小的空文件

计算每条线程需从文件哪个部分开始下载,结束

依次创建,启动多条线程来下载网络资源的指定部分

public class Downloader {

//添加@Test标记是表示该方法是Junit测试的方法,就可以直接运行该方法了

@Test

public void download() throws Exception

{

//设置URL的地址和下载后的文件名

String filename = "meitu.exe";

String path = "http://10.13.20.32:8080/Test/XiuXiu_Green.exe";

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

//获得需要下载的文件的长度(大小)

int filelength = conn.getContentLength();

System.out.println("要下载的文件长度"+filelength);

//生成一个大小相同的本地文件

RandomAccessFile file = new RandomAccessFile(filename, "rwd");

file.setLength(filelength);

file.close();

conn.disconnect();

//设置有多少条线程下载

int threadsize = 3;

//计算每个线程下载的量

int threadlength = filelength % 3 == 0 ? filelength/3:filelength+1;

for(int i = 0;i < threadsize;i++)

{

//设置每条线程从哪个位置开始下载

int startposition = i * threadlength;

//从文件的什么位置开始写入数据

RandomAccessFile threadfile = new RandomAccessFile(filename, "rwd");

threadfile.seek(startposition);

//启动三条线程分别从startposition位置开始下载文件

new DownLoadThread(i,startposition,threadfile,threadlength,path).start();

}

int quit = System.in.read();

while('q' != quit)

{

Thread.sleep(2000);

}

}

private class DownLoadThread extends Thread {

private int threadid;

private int startposition;

private RandomAccessFile threadfile;

private int threadlength;

private String path;

public DownLoadThread(int threadid, int startposition,

RandomAccessFile threadfile, int threadlength, String path) {

this.threadid = threadid;

this.startposition = startposition;

this.threadfile = threadfile;

this.threadlength = threadlength;

this.path = path;

}

public DownLoadThread() {}

@Override

public void run() {

try

{

URL url = new URL(path);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5000);

conn.setRequestMethod("GET");

//指定从什么位置开始下载

conn.setRequestProperty("Range", "bytes="+startposition+"-");

//System.out.println(conn.getResponseCode());

if(conn.getResponseCode() == 206)

{

InputStream is = conn.getInputStream();

byte[] buffer = new byte[1024];

int len = -1;

int length = 0;

while(length < threadlength && (len = is.read(buffer)) != -1)

{

threadfile.write(buffer,0,len);

//计算累计下载的长度

length += len;

}

threadfile.close();

is.close();

System.out.println("线程"+(threadid+1) + "已下载完成");

}

}catch(Exception ex){System.out.println("线程"+(threadid+1) + "下载出错"+ ex);}

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值