Java多线程下载文件
package
com.test.download;
import
java.io.File;
import
java.io.InputStream;
import
java.io.RandomAccessFile;
import
java.net.HttpURLConnection;
import
java.net.URL;
/*
* 多线程下载
*/
public
class
MulThreadDownload {
public
static
void
main(String[] args)
throws
Exception {
String path =
"http://pic.4j4j.cn/upload/pic/20130909/681ebf9d64.jpg"
;
new
MulThreadDownload().download(path,
3
);
}
public
void
download (String path,
int
threadsize)
throws
Exception{
URL url =
new
URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(
5000
);
conn.setRequestMethod(
"GET"
);
if
(conn.getResponseCode() ==
200
){
//获取网络文件长度
int
length = conn.getContentLength();
//新建本地文件保存下载数据
File file =
new
File(getFilename(path));
//计算每条线程负责下载的数据量
int
block = length%threadsize==
0
? length/threadsize : length/threadsize+
1
;
//开启指定数目的线程同时下载
for
(
int
threadid =
0
; threadid < threadsize; threadid++){
new
DownloadThread(threadid,block,url,file).start();
}
}
else
{
System.out.println(
"下载失败!"
);
}
}
private
class
DownloadThread
extends
Thread{
private
int
threadid;
//线程编号
private
int
block;
//下载块大小
private
URL url;
//下载链接
private
File file;
//下载数据保存文件
public
DownloadThread(
int
threadid,
int
block, URL url, File file) {
this
.threadid = threadid;
this
.block = block;
this
.url = url;
this
.file = file;
}
public
void
run() {
int
start = threadid * block;
//本线程下载数据写入文件开始位置
int
end = (threadid+
1
) * block -
1
;
//本线程下载数据写入文件结束位置
try
{
//创建一个随机访问文件流对象
RandomAccessFile accessFile =
new
RandomAccessFile(file,
"rwd"
);
//文件指针偏移至正确写入位置
accessFile.seek(start);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(
5000
);
conn.setRequestMethod(
"GET"
);
//设置请求数据的范围
conn.setRequestProperty(
"Range"
,
"bytes="
+start+
"-"
+end);
if
(conn.getResponseCode() ==
206
){
//状态码206:(部分内容) 服务器成功处理了部分 GET 请求
InputStream inStream = conn.getInputStream();
byte
[] buffer =
new
byte
[
1024
];
int
len =
0
;
while
((len = inStream.read(buffer)) != -
1
){
accessFile.write(buffer,
0
, len);
}
accessFile.close();
inStream.close();
}
System.out.println(
"第"
+(threadid+
1
)+
"部分下载完成"
);
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
private
String getFilename(String path) {
return
path.substring(path.lastIndexOf(
"/"
)+
1
);
}
}
Java多线程下载文件的更多相关文章
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- java多线程下载文件和断点下载
多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...
- 最新---java多线程下载文件
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...
- JAVA多线程下载网络文件
JAVA多线程下载网络文件,开启多个线程,同时下载网络文件. 源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...
- java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例
什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- 多线程下载文件,ftp文件服务器
1: 多线程下载文件 package com.li.multiplyThread; import org.apache.commons.lang3.exception.ExceptionUtils; ...
- Java多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...
随机推荐
- Vue实现增删改查功能
简单的表单CURD功能demo <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- cf 487E Tourist
题目大意 给定\(n\)个点\(m\)条边的无向连通图,无重边 每个点有点权 两个操作: 1.单点点权修改 2.询问从x到y的简单路径中,路径经过点的最小值的最小值时多少 (简单路径指经过每一个点至多 ...
- 练习题 求a[i]到a[j]累积和为最大的部分
原文发布时间为:2009-03-09 -- 来源于本人的百度文章 [由搬家工具导入] 1、有一个数组a[n],里面的数只有两种:-1或1。i,j是两个整数,假设0<=i<=j<=n- ...
- uml六种关系 【继实关聚组依】
关联association,聚合aggregation,组合composition,依赖dependicy,继承generalization,实现relization powerdesigner从上往 ...
- 【Chrome】Octotree Chrome插件离线安装
插件下载地址:http://www.cnplugins.com/devtool/octotree/download.html Octotree 是国外程序员Buu Nguyen 做的一个 Chrome ...
- error C2275 将此类型用作表达式非法
http://blog.csdn.net/lqk1985/article/details/7389159 C2275: “size_t”: 将此类型用作表达式非法,同时还导致一堆变量未定义的bug. ...
- python进阶学习
python高级用法 github: https://github.com/cq146637/Advanced
- IOS view的圆角和阴影并存
记录一下这个简单但又难搞的问题,如何设置 view的圆角和阴影并存 UIView *v=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 100, 100 ...
- 当前标识(IIS APPPOOL\ASP.NET v4.0)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限 解决方案
今天搭环境的时候遇到这个问题,折腾了一阵子,最后在微软官方论坛上找到了解决方案. https://forums.asp.net/t/1566987.aspx?Current+Identity+does ...
- HDFS读文件过程分析:读取文件的Block数据
转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStrea ...