- 浏览: 407305 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (158)
- SpringBoot (10)
- vue.js (4)
- 2017基础知识 (2)
- jquery (4)
- extjs (8)
- spring (13)
- Java基础 (24)
- ibatis (2)
- oracle (18)
- 服务器配置 (8)
- maven (7)
- web应用开发 (14)
- 数据库 (9)
- 第三方依赖 (3)
- 百味人生 (7)
- svn (1)
- 问题一堆 (2)
- 测试驱动开发 (1)
- webServices (2)
- 网络编程 (2)
- 其它 (4)
- hibernate (2)
- ec标签序号列 (1)
- javascript (1)
- ActiveMQ (2)
- linux (5)
- UI (1)
- 问题汇集 (1)
- redis (1)
最新评论
-
jackson200:
讲解的狠不错!谢谢!
spring注入原理 -
阳光泛滥的日子:
讲的很透彻,受教了 。
spring中注解的实现原理 -
liudechao9:
最近在研究这方面,很不错,但是多线程并发的时候可能会出问题,而 ...
spring中注解的实现原理 -
小帅1127:
厉害啊 我的哥
spring中注解的实现原理 -
phoenixpaul:
...
Oracle存储过程和程序包
网络蚂蚁、FlashGet、迅雷等支持HTTP协议的下载软件无一例外地使用了多线程下载技术。比起单线程下载,多线程下载在同一时间段内发出多个下载请求,每个下载请求负责下载一段内容,充分地利用了网络带宽。
当然多线程下载并非线程数越多越好。试想,一个极端 的情况:一个尺寸为1 024个字节的远程文件,动用1 024个线程来下载,每个线程平均只下载一个字节,创建线程的代价和对自身网络出口造成的堵塞远远大于分工下载带来的好处。因此,多线程下载存在一个权衡 的问题。一般来说,需要事先根据待下载的远程文件的尺寸来决定启用多少个线程,如果文件很小,则意味着使用单线程下载即可。而且,下载软件允许创建的线程 数一般是设置上限的,例如即使下载一个超大文件,也不能开启过多的线程,毕竟创建下载线程是需要耗费客户端资源的,并且线程之间存在着竞争网络带宽的关 系。总之,下载线程数往往是在待下载的远程文件尺寸、每个线程分担的字节数任务、线程数三者之间权衡的结果。
实战多线程下载,有几个技术难题有待攻克:
— 如何获取远程文件的尺寸,这关系到开启多少个下载线程。本节例程采用比较简单的线程数决策策略:固定每个线程分担的字节数任务,根据远程文件尺寸来决定需 要开启的下载线程,也就是不考虑下载线程数过多带来的负面影响。因此,获取远程文件的尺寸就成为了很关键的一个步骤。
— 如何实现分工下载,即每个线程只下载远程文件的一段。这是多线程HTTP下载的核心技术。
— 如何存储、组织各个线程下载得到的文件碎片,最后将其拼成一个完整的文件。
package com.yt.manager.net.download; import java.io.File; import java.net.HttpURLConnection; import java.net.URL; /** * @Description: * @ClassName: DownFile * @Project: base-info * @Author: zxf * @Date: 2011-7-13 */ public class DownFile { /** * 下载 * * @throws Exception * */ public void down(String path, int threadnum) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(10 * 1000); conn.setRequestMethod("GET"); // 获得网络文件的长度 int length = conn.getContentLength(); // 每个线程负责下载的文件大小 int block = (length % threadnum) == 0 ? length / threadnum : length / threadnum + 1; //从http相应消息获取的状态码,200:OK;401:Unauthorized if (conn.getResponseCode() == 200) { for (int i = 0; i < threadnum; i++) { // 开启线程下载 new DownThread(i, new File(realPath(),getFileName(path)), block, url).start(); } } } /** * 文件的下载目录 * @return */ public String realPath(){ String realPath = "h:/download"; File file = new File(realPath); if (!file.exists()) { file.mkdirs(); } return realPath; } /** * 获取文件名 * @param path * @return */ public String getFileName(String path) { return path.substring(path.lastIndexOf("/") + 1); } public static void main(String[] args) { DownFile test = new DownFile(); //String path = "http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe"; String path ="http://www.baidu.com/img/baidu_sylogo1.gif"; int threadnum = 3; try { test.down(path, threadnum); } catch (Exception e) { e.printStackTrace(); } } }
package com.yt.manager.net.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /** * @Description: * @ClassName: DownThread * @Project: base-info * @Author: zxf * @Date: 2011-7-13 */ public class DownThread extends Thread { private int id; // 线程id private File file;// 目标文件 private int block;// 每个线程下载文件的大小 private URL url; public DownThread() { } public DownThread(int id, File file, int block, URL url) { this.id = id; this.file = file; this.block = block; this.url = url; } @Override public void run() { int start = (id * block);// 当前线程开始下载处 int end = (id + 1) * block - 1;// 当前线程结束下载处 // 建立随机操作文件对象 try { RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.seek(start);// 设置操作文件的入点 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); // 指定网络位置从什么位置开始下载,到什么位置结束 conn.setRequestProperty("Range", "bytes=" + start + "-" + end + ""); InputStream in = conn.getInputStream();// 获得输入流 byte[] data = new byte[1024]; int len = 0; while ((len = in.read(data)) != -1) { accessFile.write(data, 0, len); } accessFile.close(); in.close(); System.out.println("线程:" + id + "下载完成!"); } catch (Exception e) { e.printStackTrace(); } } }
- 多线程下载网络资源.rar (2 KB)
- 下载次数: 40
评论
1 楼
depravedangel
2011-11-25
conn.setRequestProperty("Range", "bytes=" + start + "-" + end + "");
range需全部大写
发表评论
-
采用DES加密解密实现接口的通信加密认证
2018-08-22 09:20 770DES全称Data Encryption Standard, ... -
log4j2 配置
2016-01-06 17:10 71181、log4j2官方下载地址h ... -
本文出一个简单读取JVM内存使用情况的例子
2015-12-07 15:16 748<%@page contentType="t ... -
代替request.getRealPath()
2014-03-21 11:22 980代替request.getRealPath(); ... -
session超时时间设置方法
2012-11-05 15:11 1059由于session值之前没有设置,以至于刚登录的 ... -
ant 使用
2012-06-25 11:41 1209build.xml <?xml version=&qu ... -
ant 使用
2012-06-25 11:39 2build.xml <?xml version=&qu ... -
java中的排序
2012-02-15 10:01 983/** * 选择排序:首先第一趟从n个元素中找到最大或最小 ... -
封装类比较出现的问题
2011-10-09 10:24 1156Java为了性能提供了一个类似缓存的东西,不仅仅 ... -
java多线程三:线程同步
2011-07-20 11:21 1535多线程编程是很有趣的事情,它常常容易出现"错误 ... -
java多线程二:控制线程方法
2011-07-20 10:25 986join线程: 1、Thread线程提供了让一个线程等待另外 ... -
java多线程一:概念与原理
2011-07-19 16:13 11281、线程是什么? ... -
java多线程
2011-07-19 15:06 31、线程是什么? 几乎所有的操作系统都支持 ... -
java多线程
2011-07-19 15:05 21、线程是什么? 几乎所有的操作系统都支持同事运 ... -
java多线程
2011-07-19 15:05 11、线程是什么? 几乎所有的操作系统都支持同事运行多 ... -
java多线程
2011-07-19 14:56 3http://lavasoft.blog.51cto.com/ ... -
java中的IO操作
2011-07-13 14:54 10651、 Java 的 IO 支持通过 ja ... -
Java垃圾回收机制
2011-07-06 16:55 14541、当程序创建对象时, ... -
java反射机制
2011-06-02 14:06 989一、定义: 1、在Java运行时环境中,对于任意 ... -
Java序列化
2011-05-30 14:51 1216一、当两个进程在进行 ...
相关推荐
新鲜出炉的SpringBoot版本的多线程下载文件,可以拿来整合SpringBoot项目或者SSM项目,可直接运行测试!!!
可以多线程下载文件c++的客户端软件,可以切割文件并传输
C#实现多线程下载文件,结合多线程技术的各方面知识,是比较好的学习例子。
java实现多线程下载文件功能,通过线程池管理,实现下载文件速度快,安全。
qt多线程下载文件的Demo,支持http协议,支持多任务下载
Android多线程下载文件,支持断点续传,这里用的数据库存储
C# 多线程下载文件 下载即可运行 vs05.
Android多线程下载文件实例 Android多线程下载文件实例
C#多线程下载文件源码测试通过,而且值得参考,源码易懂易用适合二次开发
Android多线程断点续传下载器,很好的学习资料,包括完整代码以及详细注释。 无须其他配置,在网上找一个mp3下载地址(我找的是百度音乐)放到strings.xml不报错就行。
htp多线程断点下载文件 线程数量并不代表下载的速度喔。
这是一个在listview或gridview中选项同时分别下载文件的demo。 每个选项进度条分别更新进度。
VB带进度条动画的多线程下载文件源码,一款可以多线程下载的小程序,下载过程中适时显示进度条,并且本多线程下载程序是4线程同步下载,真正的多线程下载。使用说明:一款可以加快下载文件速度的绿色小程序,有了它...
写一个多线程分块下载文件工具。网上的一些代码可能会有些奇怪的问题,用的是类全局变量打开文件但在多线程中并未加锁,会导致文件有一定几率出现大小和源文件不同,即使文件大小相同,MD5值也不同,中间有一段是坏的...
java多线程下载文件源码,只能用炫酷来形容,感兴趣就下载看看吧
java多线程断点下载文件 ,文档介绍及代码实现
多线程下载文件,支持断点续传,下载文件信息保存到配置文件,如果异常中断,可以直接读取配置文件继续进行下载。已测试过4G以上的文件下载。
C# 多线程基本于httpwebrequest实现的下载功能 每个线程均可以通过事件追踪情况