为了账号安全,请及时绑定邮箱和手机立即绑定

java的断点下载

标签:
Android
public static final int threadCount =3;
public static void main(String[] args) throws IOException {
String path = "http://localhost:8080/oppo.mp4";//下载文件的路径,也可以是网上的路径
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");//Get请求
int code = conn.getResponseCode();
if(code == 200){
int length = conn.getContentLength();//文件的大小
RandomAccessFile raf = new RandomAccessFile("setup.mp4", "rwd");
/**
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。  
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。  
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。  
"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 
 */
raf.setLength(length);//指定创建这个文件的大小
raf.close();//关闭流
//假设是三个线程
int blockSize = length / threadCount;
for(int i = 1; i<=threadCount; i++){
int startIndex = (i-1)*blockSize;
int endIndex = i*blockSize-1;
if(i==threadCount){//当线程为最后一个线程,则末尾等于文件的大小
endIndex = length;
}
new DownloadThread(i, startIndex, endIndex, path).start();//开启线程
}
}
}
public static class DownloadThread extends Thread{
private int threadId;//线程的Id
private int startIndex;//下载的开始位置
private int endIndex;//下载的结束位置
private String path;//下载文件的路径
public DownloadThread(int threadId, int startIndex, int endIndex,
String path) {
super();
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
this.path = path;
}
@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="+startIndex+"-"+endIndex);
int code = conn.getResponseCode();
System.out.println("code:"+code);
//从服务器请求全部的资源成功返回 200  如果从服务器请求部分资源成功返回 206
if(code == 206){
InputStream is = conn.getInputStream();//已经设置了setRequestProperty
//RandomAccessFile随机文件访问类,可以指定从某个位置开始下载
RandomAccessFile raf = new RandomAccessFile("setup.mp4", "rwd");
raf.seek(startIndex);//定位文件
int len = 0;
byte[] buffer = new byte[1024];
while((len = is.read(buffer)) != -1){
raf.write(buffer,0,len);
}
is.close();
raf.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

原文链接:http://www.apkbus.com/blog-523232-59372.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消