java实现多线程下载技术

Java 多线程下载技术实现 多线程下载多线程下载技术,简单的说就是把要下载的文件分成几块,由不同的线程来负责每一块数据的下载任务。技术要点 RandomAccessFile: Java中用来实现随机访问文件的类 http Range请求头 具体思路1、文件分块。 文件分块大小(blockSize)= (文件大小 +线程数 - 1 )/ 线程数 ; 2、确定每一个线程所要下载的 文件的起始和结束位置。 现假设为每个线程分 阅读详情

        多线程下载技术,简单的说就是把要下载的文件分成几块,由不同的线程来负责每一块数据的下载任务。

        要使用一个随机访问文件的类:RandomAccessFile类,具体用法请参考:http://blog.youkuaiyun.com/java4found/article/details/8656695

        具体思路:

             1、文件分块。 文件分块大小block = 文件大小 % 线程数 == 0 ? 文件大小 / 线程数 : 文件大小 / 线程数 + 1 ; 

             2、确定每一个线程下载对应用文件的位置指针。

                     现假设为每个线程分别编号threadid     0 1 2 3 4

                     则第一个线程负责的下载位置是: 0*分块大小  到  (0+1)*分块大小-1

                     第二个线程负责的下载位置是: 1*分块大小   到  (1+1)*分块大小-1

                           即有开始下载位置 start = threadid*block;

                           即有结束下载位置 end = (threadid+1)*block-1;

             3、最后通过设置连接的属性, conn.setRequestProperty("Range", "bytes=" + start + "-" + end);

简易的多线程下载代码如下:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class MultiThread {
	public static void main(String[] args) {
		//文件下载路径
		String filePath = "http://dldir1.qq.com/qqfile/qq/QQ2013/QQ2013Beta2.exe";
		//文件保存路径
		String destination = "D:";
		//打算开启的线程数
		int threadNum = 5;
		new MultiThread().download(filePath, destination, threadNum);
	}

	/**
	 * 下载文件
	 */
	private void download(String filePath, String destination, int threadNum) {
		try {
			//通过下载路径获取连接
			URL url = new URL(filePath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			//设置连接的相关属性
			conn.setRequestMethod("GET");
			conn.setReadTimeout(5000);
			//判断连接是否正确。
			if (conn.getResponseCode() == 200) {
				// 获取文件大小。
				int fileSize = conn.getContentLength();
				//得到文件名
				String fileName = getFileName(filePath);
				//根据文件大小及文件名,创建一个同样大小,同样文件名的文件
				File file = new File(destination + File.separator + fileName);
				RandomAccessFile raf = new RandomAccessFile(file, "rw");
				raf.setLength(fileSize);
				raf.close();
				// 将文件分成threadNum = 5份。
				int block = fileSize % threadNum == 0 ? fileSize / threadNum
						: fileSize / threadNum + 1;
				for (int threadId = 0; threadId < threadNum; threadId++) {
					//传入线程编号,并开始下载。
					new DownloadThread(threadId,block, file, url).start();
				}

			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//由路径获取文件名。
	private String getFileName(String filePath) {
		return filePath.substring(filePath.lastIndexOf('/') + 1);
	}

}

//文件下载线程
class DownloadThread extends Thread {
	int start, end,threadId;
	File file = null;
	URL url = null;

	public DownloadThread(int threadId,int block, File file, URL url) {
		this.threadId = threadId;
		start = block * threadId;
		end = block * (threadId + 1) - 1;
		this.file = file;
		this.url = url;
	}

	public void run() {
		try {
			//获取连接并设置相关属性。
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setReadTimeout(5000);
			//此步骤是关键。
			conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
			if (conn.getResponseCode() == 206) {
				RandomAccessFile raf = new RandomAccessFile(file, "rw");
				//移动指针至该线程负责写入数据的位置。
				raf.seek(start);
				//读取数据并写入
				InputStream inStream = conn.getInputStream();
				byte[] b = new byte[1024];
				int len = 0;
				while ((len = inStream.read(b)) != -1) {
					raf.write(b, 0, len);
				}
				System.out.println("线程"+threadId+"下载完毕");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



Java实现多线程分片文件下载 分片下载 所谓分片下载就是要利用多线程的优势,将要下载的文件一块一块的分配到各个线程中去下载,这样就极大的提高了下载速度。 技术难点 并不能说是什么难点,只能说没接触过不知道罢了。 1、如何请求才能拿到数据的特定部分,而非全部? 可以在HTTP请求头中加入Range来标识数据的请求范围/区间,从HTTP/1.1开始可用。 基本用法: Range: bytes=10-:取第10个字节及后所有数据。 ... 阅读详情

相关推荐

Java多线程文件下载技术实现与应用

在多线程编程中,线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程可以被用来执行程序中的多个部分,使其并行执行。线程的生命周期包括以下五个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。在Java中,这些状态是通过Thread类中的一系列方法来管理的。当一个线程实例被创建时,它处于新建状态。

weixin_35433448的博客 652

Java实现简单的多线程URL下载器

程序主要类中的数据成员主要是主窗口的各个组件,而主要进行的操作就是所有组件的初始化以及添加到主窗口并显示窗口,最重要的是为了所有按钮添加事件监听程序,不同的按钮对应不同的操作,“新建下载”是输入所有参数和初始化下载线程(可能读取配置文件),“继续下载”是打开一个存在的配置文件并且用其中的信息进行下载线程的初始化,“开始”是启动所有下载线程和统计线程,“暂停”是保存当前下载进度到配置文件并且结束所有下载线程。如果判断到读取出的字节数为-1,说明该下载线程已经下载完成了需要下载的数据,那么关闭输入输出流。

moonwalker的博客 2934

PLUS模型土地利用变化模拟使用简介

因子包括自然因子如社会因子,通过计算整理得到新图层,并以tif文件输出到驱动因子的文件夹里,驱动因子文件夹里存放的是tif文件格式。线性回归使用提供的所有的LULC资源数据,可以选择往后预测的年数,选择好数据之后,可以得出预测的每一年的每一用地类型面积数据。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。

qq_42831270的博客 5806

Java多线程下载文件

以下载多个文件为例,如何使用多线程机制,高效率的完成下载任务?

laizhenghua的博客 2879

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定

如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。

微:13763355074 4844

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1443

java利用多线程批量下载文档--附测试用例

!解决导出nginx超时问题 1、使用CountDownLatch+Runnable去优化批量下载问题,优化springboot批量下载word打包zip并通过浏览器下载的操作 2、提供实际项目模板案例、修改对应参数即可。

m0_51706962的博客 2646

iTunes登录协议抓包避坑指南:解决HTTPDebugger被检测问题(附临时方案)

本文详细解析了iTunes客户端登录协议抓包时遇到的HTTPDebugger等工具被检测的问题,并提供了实战解决方案。通过逆向分析iTunes的反调试与反检测机制,文章指导读者如何定位并绕过关键检测点,成功捕获登录流量,并深度解析了包括证书获取、签名缓冲区和最终认证在内的核心协议流程。

qsc901234的博客 808

[Java多线程实现批量下载文件,层层优化多种方案实现?]

望岳 (唐) 杜甫 岱宗夫如何,齐鲁青未了。造化钟神秀,阴阳割昏晓。 荡胸生层云,决雌入归鸟。会当凌绝顶,一览众山小。

汤圆的博客 4853

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

apollo-减速带通行

主车在通过减速带时速度不超过3m/s

是菜鸟o的博客 389

Java 多线程下载文件

package cn.com.skyvis.Mystudy; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.CountDownLatch; public class MutiThreadDownLoad { /** * 同时下载的线程数

qq_41972358的博客 1153

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2869

Java多线程下载技术实现

多线程下载 多线程下载技术,简单的说就是把要下载的文件分成几块,由不同的线程来负责每一块数据的下载任务。 技术要点 RandomAccessFile: Java中用来实现随机访问文件的类 http Range请求头 具体思路 1、文件分块。 文件分块大小(blockSize)= (文件大小 +线程数 - 1 )/ 线程数 ; 2、确定每一个线程所要下载的 文件的起始和结束位置。 现假设为每个线程分...

zhaoyang10的专栏 4305

电子元器件-三极管终终篇:三极管工作原理详解、参数/手册详解、开关应用详解、Ib电流研究、开关应用实例

三极管工作原理与应用摘要 三极管是一种电流控制器件,通过小基极电流控制大集电极电流。其内部结构由高掺杂发射区、薄低掺杂基区和中等掺杂集电区组成,形成NPN或PNP结。三极管有三种工作状态: 截止区:发射结和集电结均反偏,无放大作用 放大区:发射结正偏,集电结反偏,Ic=βIb 饱和区:两结均正偏,Ic不再随Ib增大 作为开关使用时,需确保三极管深度饱和(Vce≈0.2V)。设计要点包括: 基极电阻计算确保Ib足够大 集电极电阻控制Ic 基极加下拉电阻提高抗干扰 NPN管作地开关,PNP管作电源开关 典型应用

qq_60226558的博客 312

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

使用Java实现多线程下载技术

首先需要两个类 下载类: package com.gyx; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.*; public class Download extends Thread{ Integer startIndex; Integer endIndex; Integ

qq_44098792的博客 151

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于java服务端及android客户端的仿讯雷多线程下载技术实现_Java / Android H基于ttp多线程下载的实现...

有个朋友须要个多线程如今的样例,就帮忙实现了。在此分享下~先说下原理,原理明确了,事实上非常easy:a、对于网络上的一个资源,首先发送一个请求,从返回的Content-Length中回去须要下载文件的大小。然后依据文件大小创建一个文件。this.fileSize = conn.getContentLength();// 依据响应获取文件大小File dir = new File(dirStr);...

weixin_32964881的博客 114

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于java服务端及android客户端的仿讯雷多线程下载技术实现_Java / Android 基于Http的多线程下载的实现...

有个朋友需要个多线程现在的例子,就帮忙实现了,在此分享下~先说下原理,原理明白了,其实很简单:a、对于网络上的一个资源,首先发送一个请求,从返回的Content-Length中回去需要下载文件的大小,然后根据文件大小创建一个文件。this.fileSize = conn.getContentLength();// 根据响应获取文件大小File dir = new File(dirStr);this...

weixin_34622572的博客 126

material-components-web 编码最佳实践:MDC Web 命名、隔离、性能与 TypeScript 开发规范深度解析

本篇技术指南以 MDC Web(material-components-web)官方开发规范文档 [docs/code/best_practices.md](https://link.gitcode.com/i/19eee89a2c8406dad07c50022dd86531) 为主体骨架,结合仓库内真实源码逐一印证:从 BEM 命名、文档写作、组件隔离到 GPU 动画性能,再到 TypeScri

gitblog_02297的博客 436

基于java服务端及android客户端的仿讯雷多线程下载技术实现_java多线程实现服务器端与多客户端之间的通信...

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。应用多线程来实现服务器与多线程之间的通信的基本步骤服务器端创建ServerSocket,循环调用accept()等待客户端链接客户端创建一个Socket并请求和服务器端链接服务器端接受客户端请求,创建socekt与该客户端建立专线链接建立链接的socket在一个单独的线程上对话服务器继续等待新的链接服务...

weixin_42636895的博客 130

Java多线程下载工具,多线程,多任务,断点续传,GUI

多任务下载:封装任务类,每个任务类中记录着下载地址(URL)、保存地址、下载线程数组、监控线程、下载的对话框、是否时断点续传、线程数量、每个线程已经下载的字节数(当断点续传时)、文件长度、是否正在下载等信息,每次新建下载任务都会初始化一个任务对象,然后这个对象运行下载线程和监控线程。下载任务监控线程:每个下载任务中都包括一个监控和线程,监控和线程每隔一秒会检查每个下载线程的下载情况,并实时计算出下载的完成百分比、已下载的大小、下载速度、已下载时间、预计下载剩余时间等信息,并实时显示在对话框上。

一+一加1的博客 1431

Java / Android 基于Http的多线程下载的实现

有个朋友需要个多线程现在的例子,就帮忙实现了,在此分享下~ 先说下原理,原理明白了,其实很简单: a、对于网络上的一个资源,首先发送一个请求,从返回的Content-Length中回去需要下载文件的大小,然后根据文件大小创建一个文件。 this.fileSize = conn.getContentLength();// 根据响应获取文件大小 File dir = new File(dirSt

Hongyang 2万+

JAVA多线程下载器

大二末了,选好了方向,而去也喜欢网络并发,多线程之类的,就决定做个多线程下载器,学习学习文件,网络,线程间通讯的方法。 代码其实早就开始写,只是一直比较忙,也没写多少。今天认真花了一天把下载线程写了。 这个主要问题是下载文件的配置信息的写入,刚开始没有计算好seek()的参数,两个数之间总是差一截空白,找一两个点,发现seek是字节,而且JAVA写入的字母数字都是2字节一个的。下面是下载线程的

iloveflyatsky的博客 866

利用多线程技术,实现一个下载的进度条,每秒下载10%。

目录代码问题 代码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Test9_4 extends JFrame { protected JProgressBar dl=new JPr...

为什么他的emp没后座 932

java 多线程下载器_Java多线程的下载器(1)

实现了一个基于Java多线程的下载器,可提供的功能有:1. 对文件使用多线程下载,并显示每时刻的下载速度。2. 对多个下载进行管理,包括线程调度,内存管理等。一:单个文件下载的管理1. 单文件下载类层次首先简要介绍一下单个文件下载管理的类层次:来一张图来表示。为需要下载的文件创建一个Download类,Download负责管理该文件下载时的线程管理、文件管理、当前速度计算等操作。根据线程的数目tN...

weixin_39806388的博客 267
上一篇: java线程的基本应用
下一篇: xml文件的sax解析
Sweeter
博客等级 码龄14年 81粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值