JAVA IO 之多线程下载
来源:互联网 发布:楼梯踏步高度算法 编辑:程序博客网 时间:2024/06/05 09:11
JAVA 多线程下载
1.多线程下载是基于JavaIO流 和线程的一种技术,类似于迅雷下载的功能,可以满足在网上下载东西的基本需求,当然这对于一个菜鸟新手肯定觉得是很能装B的。
2.首先我们要了解多线程下载的原理,原理如下图,
上图为我们的思路图,有需要定于的参数和需要使用的类,
1.需要使用的类为,HttpUrlConnection ,这是从服务器中拿东西,RandomAccessFile ,用于在本地保存文件。
上图将怎么下载分成两份,一份服务器端,一份客户端。
2.服务端需要用到的参数:
int filesize : 文件大小
int threadindex: 线程个数
int singlethreadNum : 每个线程下载多大(计算公式为:singlethreadNum=filesize%threadsize==0?filesize/thread:filesize/threadsize+1)
int startPosition :每个线程下载的开始位置 (计算公式为:threadindex*singlethreadNum)
int endPosition :每个线程下载的结束位置 (计算公式为:(threadindex+1)*singlethreadNum-1)
以上是需要用到的参数
代码如下:
/*
测试类
*/
package Com.zking.test;
import java.io.File;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class TestDown {
public static void main(String[] args) {
//设置线程数
int threadnum=50;
//下载路径
String path="http://localhost:8080/web_luopenghui/images/s8.jpg";
//httpurlconnection
try {
//获取下载地址
URL url=new URL(path);
//通过下载地址打开连接
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//设定请求方式
conn.setRequestMethod("GET");
//判断响应码是否为200 只有200的时候才会进入这个网页
if(conn.getResponseCode()==200){
//获取服务器中文件的大小
int length=conn.getContentLength();
//保存的文件路径
File f=new File("C:/s8.jpg");
//对随机的文件进行读写
RandomAccessFile raf=new RandomAccessFile(f,"rwd");
//设置下载文件大小
raf.setLength(length);
raf.close();
//每个线程下载的数据量
int singleThreadNum= length%threadnum==0 ? length/threadnum:length/threadnum+1;
for (int i = 0; i < threadnum; i++) {
new DownThread(i, url, f, singleThreadNum).start();
}
}else{
System.out.println("网页错误");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//线程下载类
package Com.zking.test;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownThread extends Thread{
public int id;//线程id
public URL url;//文件下载的路径
public File file;//文件保存的路径
public int singlethreadNum;//每个下载的数据量
public DownThread(int id, URL url, File file, int singlethreadNum) {
super();
this.id = id;
this.url = url;
this.file = file;
this.singlethreadNum = singlethreadNum;
}
@Override
public void run() {
try {
RandomAccessFile raf=new RandomAccessFile(file, "rwd");
//分别计算每个下载的开始位置和结束位置
int start=id*singlethreadNum;
int end=(id+1)*singlethreadNum-1;
//通过传过来的URL 获取下载的连接
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
//设置下载超时值
conn.setReadTimeout(5000);
//设置一般请求属性
conn.setRequestProperty("Range", "bytes="+start+"-"+end);
//局部请求 状态码为206
if(conn.getResponseCode()==206){
raf.seek(start);
//获取输入流
InputStream is=conn.getInputStream();
byte[] bytes=new byte[1024];
int len=0;
while((len=is.read(bytes, 0, bytes.length))!=-1){
raf.write(bytes, 0, len);
}
raf.close();
is.close();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
代码基本也就在这了,大家去了解了解
如果不懂,回复评论,有时间会看的,然后在交流,我也有自己录下的视频,可以交流交流,也可以加QQ 739560489
- JAVA IO 之多线程下载
- Java之多线程下载
- java 网络数据传输之多线程下载
- Java之多线程断点下载的实现
- Java之多线程断点下载的实现
- 网络编程--JAVA之多线程下载
- Java基础之多线程断点下载
- HttpURLConnection之多线程下载
- 网络编程--JAVA之多线程下载后续:断点续存
- 【Java】Java之多线程
- Android 之多线程下载原理
- 安卓之多线程下载
- Android之多线程断点下载
- Android 之多线程下载原理
- Java学习之多线程
- java基础教程之多线程
- java之多线程
- Java学习之多线程
- 链表出错
- 替换SQL字段中的换行符,回车符,空格等特殊符号
- ORACLE如何返回结果集
- Redis集群管理之Redis Cluster集群节点增减
- 第七届蓝桥杯参赛经历回顾
- JAVA IO 之多线程下载
- 怎样使用简单的IO流
- 01pakage.java
- WebSphere 6.0 000000e TimeoutManage I WTRN0006W 事务超时,解决方案
- alias vi=`vim`
- GCD 时间源小例
- pat 1001
- PAT 1002
- AVLTreeTest.java