package xiawenquan.com;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 多线程下载
* @author xiawenquan
*
*/
public class MyDownLoad {
public static void main(String[] args) {
String path = "http://gb.cri.cn/mmsource/images/2011/10/22/a817ae91a2bb48e59c40673a9694b5fb.jpg";
new MyDownLoad().download(path,3);
}
/**
* 根据路径和线程数下载文件
* @param path
* @param threadSize
*/
private void download(String path, int threadSize) {
try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(60*1000);
connection.setRequestMethod("GET");
if(connection.getResponseCode() == 200){
int fileLength = connection.getContentLength();
File file = new File(getFileNameByPath(path));
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.setLength(fileLength);
accessFile.close();
// 计算每条线程下载的数据量,如果不整除则加上1
int block = fileLength / threadSize == 0 ? fileLength / threadSize : fileLength / threadSize + 1;
for(int threadid = 0; threadid < threadSize; threadid ++){
new DownLoad(threadid,block,url,file).start();
}
}else{
System.out.println("下载失败!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据路径获取文件名称
* @param path
* @return
*/
private String getFileNameByPath(String path) {
String fileName = path.substring(path.lastIndexOf("/" ) + 1);
return fileName;
}
// 负责下载的线程类
private class DownLoad extends Thread{
private int threadid;
private int block;
private URL url;
private File file;
public DownLoad(int threadid, int block, URL url, File file) {
this.threadid = threadid;
this.block = block;
this.url = url;
this.file = file;
}
@Override
public void run() { // TODO 这个run()是每个线程下载的代码
try {
int start = threadid * block ; // 计算线程下载的开始位置
int end = (threadid + 1) * block - 1;// 计算线程下载的结束位置
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.seek(start); // seek()是使每一条线程在本地文件file中的什么位置开始写入数据
// 然后每条线程去连网
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(60*1000);
connection.setRequestMethod("GET");
connection.setRequestProperty("Range", "bytes=" + start + "-" + end );
if(connection.getResponseCode() == 206){ // 分段下载的返回码不是200,而是206
InputStream inputStream = connection.getInputStream(); // 获取网络返回来的数据,返回来的数据是每一条线程的下载的数据
byte buffer[] = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
accessFile.write(buffer, 0, len);
}
accessFile.close();
inputStream.close();
System.out.println("第" + (threadid + 1) + "条线程下载完成");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
- 大小: 145.2 KB
分享到:
相关推荐
Java源码,android多线程下载器演示
Android多线程下载,移植了上一次java编程中的代码。。。
android java 多线程下载工具类 调用一个方法即可
通过JNI接口静态注册的native方法去创建线程,同时提供native回调Java的方法。通过这个框架可以去实现线程监听某一个状态,然后回调Java的方法(如发消息去通知顶层,实现显示)
资源为博客实例代码:http://blog.csdn.net/lmj623565791/article/details/26994463 有问题博客中留言
Java、Android多线程、线程池Demo
NoHttp核心架构之多线程通信、线程安全、线程同步;synchronized锁,Lock锁;具体讲解请移步:http://blog.csdn.net/yanzhenjie1003/article/details/50992468
Android 文件下载功能Java多线程下载功能的例子实例源码
请参看文档:http://blog.csdn.net/sinat_29398599/article/details/52921172
NoHttp核心架构之多线程通信、线程安全、线程同步;synchronized锁,Lock锁;具体讲解请移步博客:http://blog.csdn.net/yanzhenjie1003/article/details/50992468
Java源码,Android源码,多线程,断点下载 android多线程断点下载,通过本Android下载实例,可了解到以下知识技巧:实时得到文件下载的长度,设置获取实体数据的范围、获取文件已下载文件长度、原始文件长度、线程数、...
Android多线程断点下载.zip源码资源下载Android多线程断点下载.zip源码资源下载
Android 多线程断点下载源码.zip源码资源下载Android 多线程断点下载源码.zip源码资源下载
1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位置是i * range到(i + 1) * rang - 1,注意最后一段的位置是到filesize - 1; ...
一个多线程访问的同一个资源,java synchronized互斥锁的用法,android和此用法一致。
java多线程下载文件,支持断点下载.同样支持android开发
Android多线程断点下载.zip项目安卓应用源码下载Android多线程断点下载.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...
Android 多线程断点下载源码.zip项目安卓应用源码下载Android 多线程断点下载源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考