import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownLoader {
//多线程文件下载
//使用HTTP的Range字段指定每条线程从文件的什么位置开始下载,如从文件的2mb位置下载就是bytes=2097252,2MB的字节
public static void main(String[] args){
//主方法
DownLoader d=new DownLoader();
try {
d.download();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void download() throws Throwable{
String filename="QQGAME.exe";//取文件名
//得到下载路径
String path="http://dldir3.qq.com/minigamefile/QQGame2013Beta4P2_setup_guanjia.EXE";
URL url=new URL(path);//建立url对象,把这个路径传进去
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);//设置超时
conn.setRequestMethod("GET");//设置请求方式
int filelength=conn.getContentLength();//获取下载文件长度
System.out.println(filelength);
//得到随机文件类 第一个参数是文件名称 第二个参数rw是可以对文件可以进行读和写的操作
RandomAccessFile file=new RandomAccessFile(filename, "rw");
file.setLength(filelength);//设置本地文件长度等于下载文件长度
file.close(); //关闭这个文件
conn.disconnect(); //先断掉这个链接,这个方法不调用也可以
int threadsize=3;//线程数
int threadlength = filelength%3==0 ? filelength/3:filelength/3+1;//每条线程的下载长度
for (int i = 0; i < threadsize; i++) {
//计算每条线程应该从文件的什么位置开始下载
int startposition=i*threadlength;
RandomAccessFile threadfile=new RandomAccessFile(filename,"rw");
threadfile.seek(startposition);//从文件的什么位置开始写入数据
//启动3条线程分别从startposition指定的位置下载文件
new DownLoadThread(i, path, startposition, threadfile, threadlength).start();
//让用户输入一个字符才决定它是否退出
// int quit = System.in.read();
// while('q'!=quit){
// Thread.sleep(2*1000);
// }
}
}
private class DownLoadThread extends Thread{
private int threadid;
private int startposition;
private RandomAccessFile threadfile;
private int threadlength;
private String path;
public DownLoadThread(int threadid,String path,int startposition,RandomAccessFile threadfile
,int threadlength){
this.threadid = threadid;
this.startposition = startposition;
this.threadfile = threadfile;
this.threadlength = threadlength;
this.path=path;
}
@Override
public void run() {
try {
//上一个与网络的连接已经关闭了,所以要再一次得到与服务器的连接
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
//指定从文件什么位置开始下载
conn.setRequestProperty("Range", "bytes="+startposition+"-");
InputStream instream=conn.getInputStream();
byte[] buffer=new byte[1024];
int len=-1;
int length = 0;
while(length<threadlength && (len=instream.read(buffer))!=1){
threadfile.write(buffer,0,len);
length += len; //累计下载长度
}
threadfile.close();
instream.close();
System.out.println("线程"+(threadid+1)+"已经下载完成");
} catch (Exception e) {
System.out.println("线程"+(threadid+1)+"已经下载出错");
}
}
}
}
- 大小: 13.3 KB
- 大小: 21 KB
分享到:
相关推荐
Java多线程 断续 重新连接 下载。。。。。。。。。。。
Java多线程下载器
Java多线程下载Java多线程下载Java多线程下载Java多线程下载Java多线程下载
java多线程下载器,可以用java实现多线程下载功能
java多线程下载工具,多多参考,有兴趣可以评价评价········
这个是关于Java多线程方面的技术,就是多个线程发送请求,从互联网上下载图片资源,通过这个案例可以知道Java中的多线程的基础知识
java多线程下载源代码 java多线程下载源代码
演示了JAVA中的多线程 界面简单 需要请拿去
这是一个用于java多线程下载的帮助类 封装了多线程下载的方法
java多线程下载网站,网站整站下载器,这是java源码和需要的包,jsoup
JAVA多线程下载JAVA多线程下载
Java多线程下载工具
java 多线程下载 迅雷下载 纯java的,没其他jar包 java 多线程下载 迅雷下载 纯java的,没其他jar包
java多线程下载文件源码,只能用炫酷来形容,感兴趣就下载看看吧
java 实现多线程下载 ,代码清晰,逻辑清楚,注释详细
java多线程下载以及断线下载 详细注释
java多线程断点下载文件 ,文档介绍及代码实现
java 多线程下载实例,供需要参考的童鞋学习。
java 多线程下载和断点续传