当前位置: 首页 > news >正文

java多线程下载

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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);

}

}

转载于:https://my.oschina.net/liujiawan/blog/473269

相关文章:

  • MySQLdb的安装与使用
  • 谋势、聚力、强生态,用友三十而立
  • linux下svn服务器搭建
  • 聊聊sentinel的AuthoritySlot
  • element.style覆盖了我的样式!!
  • 折腾一天终于尝到了 signalr core了
  • IP地址便捷修改器 V3.5 绿色版
  • 解决子级用css float浮动 而父级div没高度不能自适应高度
  • 滴滴公布自查进展:免去黄洁莉顺风车事业部总经理职务
  • 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route
  • DHCP的配置文档
  • 53次课( NFS介绍、 NFS服务端安装配置、NFS配置选项)
  • 列出对像属性,for(var i in obj)[转]
  • mongodb嵌套文档结构设计
  • IO流之转换流
  • $translatePartialLoader加载失败及解决方式
  • bootstrap创建登录注册页面
  • Git初体验
  • java8 Stream Pipelines 浅析
  • javascript 总结(常用工具类的封装)
  • Java知识点总结(JavaIO-打印流)
  • Kibana配置logstash,报表一体化
  • mysql外键的使用
  • Python 反序列化安全问题(二)
  • React+TypeScript入门
  • react-native 安卓真机环境搭建
  • Redux 中间件分析
  • Tornado学习笔记(1)
  • 复杂数据处理
  • 汉诺塔算法
  • 回顾 Swift 多平台移植进度 #2
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 设计模式(12)迭代器模式(讲解+应用)
  • 问题之ssh中Host key verification failed的解决
  • 我的业余项目总结
  • 一道面试题引发的“血案”
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #Spring-boot高级
  • (12)Linux 常见的三种进程状态
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (九)信息融合方式简介
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 物件導向與老子思想 (OO)
  • (转)jdk与jre的区别
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net FrameWork总结
  • .Net语言中的StringBuilder:入门到精通
  • @EnableAsync和@Async开始异步任务支持