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多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...
随机推荐
- python网络
try: import urllib.request as urllib2 except ImportError: import urllib2 response = urllib2.urlopen( ...
- ios - 工具类
这几天看项目,把俺旁边小哥哥的一个工具类相中了,希望对大家有所帮助哦~~~~~~~~~ // // PLZ_Tool.h // // Created by penglaizhi on 2017/7/3 ...
- jquery取得iframe中元素的方法
原文发布时间为:2010-12-27 -- 来源于本人的百度文章 [由搬家工具导入] 收集利用Jquery取得iframe中元素的几种方法 :contents() $.trim($("if ...
- display的32种写法
你知道『回』字有四种写法,但你知道display有32种写法吗?今天我们一一道来,让你一次性完全掌握display,从此再也不用对它发愁. 从大的分类来讲,display的32种写法可以分为6个大类, ...
- 实现多线程sokect
上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Clien ...
- [翻译][Nokogiri官方教程] 解析HTML/XML文档 / Parsing an HTML/XML Document
From a String From a File From the Internet Parse Options Encoding 原文: Parsing an HTML/XML Document ...
- Android系统启动过程【转】
转自:http://www.cnblogs.com/bastard/archive/2012/08/28/2660389.html Android系统启动过程 首先Android框架架构图:(来自网上 ...
- hdu 4995(离散化下标+模拟)
Revenge of kNN Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- AC日记——Oulipo poj 3461
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37958 Accepted: 15282 Description The ...
- Centos python 2.6 升级到 2.7
前几天做了下阿里云的RDS日志相关功能,其工具大都是Python语言编写,但服务器初始化时的Python版本又不满足需求,本身也没有学过Python,因此在问题定位上费了一番周折,最后找朋友帮忙看了下 ...