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多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...
随机推荐
- 【转】 #define用法详解
#define用法详解 1.#define 的作用 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”.被定义为“宏”的标识符称为“宏名”.在编译预处理时,对程序中所有出现的“宏 ...
- 微信小程序 body属性的问题
微信小程序里面没有了body这个节点了,取而代之的是page
- Html.AntiForgeryToken 防止伪造提交
原文发布时间为:2011-05-03 -- 来源于本人的百度文章 [由搬家工具导入] In this tutorial, I am not going to discuss the concept i ...
- EasySlider-最简洁的JQuery滚动插件 可控制滚动
原文发布时间为:2010-05-05 -- 来源于本人的百度文章 [由搬家工具导入] Easy Silder是由Alen Grakalic开发的基于JQuery的滚动插件,它支持以下功能: 1.自动滚 ...
- 拖动层 拖动div 封装js 貌似不兼容FF,郁闷
原文发布时间为:2009-12-02 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- [LeetCode] Rotate List 单项链表旋转
Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...
- 無法使用 system/bin/r 讀取 pmic pm8937 hardware regitster 的原因
Platform Qualcomm MSM8917 + PM8937 + PMI8940 起因 同事問我 PM8937 的 VREG_L17 如何設定成 3.3V, 從 PM8937 hardware ...
- Matcher类详解
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher . Pattern: 一个Pattern是一个正则表达式经编 ...
- ios开发某个页面横不过来屏幕的时候
某一个页面需要横屏,其他的页面任然保持竖屏需要以下关键的几个步骤: 1.修改系统代理方法的返回值 -(UIInterfaceOrientationMask)application:(UIApplica ...
- Cryptography I 学习笔记 --- 信息完整性
1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...