JAVA下实现多线程断点下载
多线程断点下载:顾名思义是用多线程实现的,断点是当第三方因素(断电、断网等)中断下载时,下次下载可以继续上次下载的地方下载。
1、通过getContentLength可以获取要下载文件的大小,这样可以在本机上创建一个相同大小的文件用来下载。
int fileLength = connection.getContentLength();
2、由于是多线程,所以要给每一个线程均分分配要下载的位置。
for(int i = 0; i < threadCount; i ++) { int startThread = i * blockSize; int endThread = (i + 1) * blockSize - 1; if( i == blockSize - 1) endThread = fileLength -1; new DownloadThread(i, startThread, endThread).start(); }
3、启动每个线程下载时,请求头需要Range参数,值是bytes:xxx-xxx某事。比如"Range:0-10100",代表要下载的位置是从0到10100。
connection.setRequestProperty("Range", "bytes:"+startThred+"-" + endThread);
4、然后每次用RandomAccessFile写入数据到本机文件里。
while((length = inputStream.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, length); }
5、当然每次下载时需要记录本线程下载了多少,以便断点时,下载的时候可以从下次下载的地方下载。
total += length; int currentThreadPostion = startThred + total; RandomAccessFile randomAccessFile2 = new RandomAccessFile(file, "rwd"); randomAccessFile2.write(String.valueOf(currentThreadPostion).getBytes()); randomAccessFile2.close();
继承Thread类的DownloadThread类代码:
View Code
完整代码:
View Code
+加关注
0
« 上一篇:AtCoder Beginner Contest 071 ABCD
» 下一篇:HDU 6170Two strings
posted @ 2017-08-20 22:23 starry_sky 阅读(4324) 评论(12) 编辑 收藏
评论列表
#1楼 2017-08-24 22:35 Angel_Kitty
dalao好强啊,多线程都如此精通,还会Android开发,我面向对象都不会,可能是因为我没有对象吧QAQ
支持(0)反对(0)
#2楼[楼主] 2017-08-24 22:39 starry_sky
@ Angel_Kitty
我也是跟着视频敲的0.0
没对象那我帮你 new 一个对象
对象 Angel_Kitty = new 对象();
支持(0)反对(0)
#3楼 2017-08-24 22:40 Angel_Kitty
@ starry_sky
我竟无言以对,厉害了,哈哈哈哈哈
支持(0)反对(0)
#4楼 2018-03-01 22:33 yujungongwu
bytes后面是=吧,使用:响应码200
支持(0)反对(0)
#5楼[楼主] 2018-03-01 23:10 starry_sky
@ yujungongwu
刚试了下,“=”也可以,不过“:”也是可以的。
code==200才开始下载,毕竟代表请求全部资源成功,之前调式写成206没改回来,谢谢提醒!
支持(0)反对(0)
#6楼 2018-04-07 16:53 phil_jing
RandomAccessFile不需要关闭吗
支持(0)反对(0)
#7楼[楼主] 2018-04-07 17:13 starry_sky
@ phil_jing
enenen~ 我关了呀
你再仔细看看
支持(0)反对(0)
#8楼 2018-04-08 21:45 phil_jing
@ starry_sky
抱歉,我看错了;那如何多线程下载流呢,具体场景是下载导出的Excel,现在是文件越来愈大,极大影响效率
支持(0)反对(0)
#9楼[楼主] 2018-04-08 21:56 starry_sky
@ phil_jing
是指下载的文件是Excel文件,但文件大小很大吗?
文件很大的话,等下载下来就好好久,可以尝试边下载边访问数据。
不过这个还没有写过,可以尝试下。
支持(0)反对(0)
#10楼[楼主] 2018-04-08 22:01 starry_sky
@ phil_jing
知识有限,只想到这个,原谅我的无知。
支持(0)反对(0)
#11楼 2018-04-08 22:06 phil_jing
@ starry_sky
目前我没想到特别好的方法,只能将就。。。。
支持(0)反对(0)
#12楼[楼主] 2018-04-08 22:09 starry_sky
@ phil_jing
(ง •̀_•́)ง会想到的