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

1.基本思路

2.源码

package cn.itcast.download;import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.RandomAccess;public class MulThreadDownload {
public static void main(String[] args) throws Exception {String path = "http://localhost:8080/web/Dreamweaver.exe";new MulThreadDownload().download(path,3);
}
/*** ************************* *0*1*2*3*4*5*6*7*8*9*10* 文件字节* ************************* threadid:0 1 2* int block = 4 每一个下载多少* int start = threadid*block 开始位置* int end = (threadid+1)*block-1 结束位置*/
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();//new File中的参数如果直接写名字,那么表示绝对路径,会存放在当前项目下;File file = new File(getFilename(path));//RandomAccessFile是用来访问那些保存数据记录的文件的,其大小和位置必须是可知的,它可以指定seek,搜索指定的位置,在指定位置写入数据;//rwd 参数是权限,表示将读取到的资源立马写入文件中;//多线程下载先要生成一个大小一样的文件,在进行写入;RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");accessFile.setLength(length);accessFile.close();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.block=block;this.threadid=threadid;this.url=url;this.file=file;}@Overridepublic 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()==200){InputStream inputStream = conn.getInputStream();byte[] buffer = new byte[1024];int len = 0;while ((len=inputStream.read(buffer))!=-1) {accessFile.write(buffer,0,len);}accessFile.close();}accessFile.close();System.out.println("第"+threadid+"线程已经下载完成");} catch (Exception e) {e.printStackTrace();}}}
private String getFilename(String path) {return path.substring(path.lastIndexOf("/")+1);
}
}

转载于:https://my.oschina.net/gaoguofan/blog/753316

java 多线程下载文件相关推荐

  1. Java多线程下载文件

    Java多线程下载文件 优化:合理利用服务器资源,将资源利用最大化,加快下载速度 一般有两种方式: 线程池里面有N个线程,多线程下载单个文件,将网络路径的文件流切割成多快,每个线程下载一小部分,然后写 ...

  2. java 多线程下载文件并实时计算下载百分比(断点续传)

    多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...

  3. java多线程下载文件(断点下载、进度展示、网速展示)

    引言 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销. 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的. 一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可 ...

  4. java线程下载文件_Java多线程下载文件实例详解

    本文实例为大家分享了Java多线程下载文件的具体代码,供大家参考,具体内容如下 import java.io.File; import java.io.InputStream; import java ...

  5. 【Java】网络编程——多线程下载文件

    前言 多线程下载文件,比单线程要快,当然,线程不是越多越好,这和获取的源文件还有和网速有关. 原理:在请求服务器的某个文件时,我们能得到这个文件的大小长度信息,我们就可以下载此长度的某一个片段,来达到 ...

  6. Java实现多线程下载文件

    这是本人在实际开发当中遇到的多线程下载文件并记录下来 public class DownloadUtil {private String pathFile;private String strFile ...

  7. Java多线程下载分析方法

    为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...

  8. 多线程下载文件实践之旅

    目录 1.使用场景 2.多线程下载原理 3.请求如何分段下载 3.1.需要请求的数据如何分段. 3.2.分段下载的数据如何组装成完整的数据文件. 4.关键代码实现 3.成果展现 4.总结 5.参考文章 ...

  9. Java多线程下载器(简洁版)

    Java多线程下载器 https://github.com/rawchen/JDownloader/archive/refs/heads/master.zip 五一无聊搞出来的,虽然已存在IDM.XD ...

最新文章

  1. linux 定位 踩内存_运维必备的问题定位工具及案例分析
  2. Fetcher类的工作流程
  3. c#中调用Excel
  4. python分子化学模拟_python简单实现gillespie模拟
  5. 竹签子毕竟是_毕竟是什么程序和功能?
  6. 如何编写NetBeans插件
  7. 求一个向量变换为另一个向量的矩阵_OpenGL里旋转等变换矩阵为什么是4x4的矩阵...
  8. 资源地址整合与备份,即时更新
  9. 无心剑随感《爱心教育》
  10. mysql 死锁 代码_MySQL死锁问题解决的代码详细介绍
  11. 数据分析 -- 流程
  12. 聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】03_分布式扩展
  13. 在校大学生计算机等级考试可以在其他省考吗
  14. 「AR裸眼插画」零基础入门级教程来啦
  15. 道家王凤仪《五行语录》
  16. 你是开发工程师、程序员还是码农?
  17. 二清分账不解决,平台企业还能走多远?
  18. CST 2022时间如何格式化
  19. 手机病毒的剖析与防治
  20. 更改本地计算机用户名,Win10怎么修改本地账号的用户名

热门文章

  1. Mysql数据库设计规范之三数据库SQL开发规范
  2. golang 的枚举
  3. vue项目中的“Invalid Host header”
  4. 在Android开发中怎样使用Application类
  5. PHP中return的用法
  6. Laravel神奇的服务容器
  7. 详解如何修改Laravel Auth使用salt和password来认证用户
  8. Zookeeper的ZAB协议和Leader选举过程剖析
  9. MQ的连接是否是线程安全的
  10. 关于RestTemplate的几个问题