Java多线程下载

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

 
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/*
 * 多线程下载
 */
public class DownloadTest {
    //初始一个带缓存的线程池
    public static ExecutorService executorService = Executors.newCachedThreadPool();
    
	public static void main(String[] args) throws Exception {
        String path = "http://csdn-app.youkuaiyun.com/csdn.apk";
        new DownloadTest().download(path,3);
    }
     
    public void download (String path,int threadsize) throws Exception{
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(3000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            //获取网络文件长度,文件的大小(单位是字节)
            int length = conn.getContentLength();   
            //新建本地文件保存下载数据
            File file = new File("D:/"+getFilename(path));
            //计算每条线程负责下载的数据量
            int block = length%threadsize==0 ? length/threadsize : length/threadsize+1;
            //开启指定数目的线程同时下载
            for(int threadid = 0; threadid < threadsize; threadid++){
            	executorService.execute(new DownloadThread(threadid,block,url,file,length));
                //new DownloadThread(threadid,block,url,file,length).start();
            }
        }else{
            System.out.println("下载失败!");
        }
    }
     
    private String getFilename(String path) {
        return path.substring(path.lastIndexOf("/")+1);
    }
}


下载线程类

package com.download.test;

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

public class DownloadThread extends Thread{
	private static int finished;
    private int threadid;   //线程编号
    private int block;      //下载块大小
    private URL url;        //下载链接
    private File file;      //下载数据保存文件
    private int length;		//文件长度
    
    public DownloadThread(int threadid, int block, URL url, File file,int length) {
        this.threadid = threadid;
        this.block = block;
        this.url = url;
        this.file = file;
        this.length = length;
    }

    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(3000);
            conn.setRequestMethod("GET");
            //设置请求数据的范围
            conn.setRequestProperty("Range", "bytes="+start+"-"+end);
            if(conn.getResponseCode() == 206){//状态码206:(部分内容) 服务器成功处理了部分 GET 请求
                InputStream inStream = conn.getInputStream();
                long time = System.currentTimeMillis();
                byte[] buffer = new byte[1024];
                int len = 0;
                while((len = inStream.read(buffer)) != -1){
                    accessFile.write(buffer, 0, len);
                    finished += len;
                    int i = finished * 100 / length;
                    //System.out.println(finished+"----------"+length);
                    if(System.currentTimeMillis()-time>500 || finished>=length){
                    	time = System.currentTimeMillis();
                    	System.out.println("下载进度:"+i+"%");
                    }
                }
                accessFile.close();
                inStream.close();
            }
            System.out.println("第"+(threadid+1)+"部分下载完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



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

相关推荐

Java多线程下载器项目详解

本文还有配套的精品资源,点击获取 简介:Java的多线程下载器通过分割文件和并行下载,利用多线程技术提高下载效率。该工具利用Java的并发类和接口,如 Thread 、 Runnable 和 ExecutorService ,实现线程的创建和管理。项目包含线程池、任务分配、同步机制、进度跟踪、异常处理、文件合并和断点续传等关键组件,...

weixin_30923011的博客 971

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

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

moonwalker的博客 2934

【计算机视觉学习03】全景图像拼接

文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程

一个正在努力学习的iter 7787

Java多线程下载文件

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

laizhenghua的博客 2879

Unity ProBuilder(自己创建斜面、拐角)

ProBuilder基础实例

weixin_56537692的博客 1551

2024最新版Anaconda Navigator安装使用指南

本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。

jackson_lingua的博客 1万+

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

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

m0_51706962的博客 2646

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1383

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

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

汤圆的博客 4853

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 456

【Spring Cloud Alibaba】Linux安装RocketMQ以及RocketMQ Dashboard可视化工具

在当今分布式架构的开发中,消息队列成为了一种常见的解决方案。RocketMQ是阿里巴巴开源的分布式消息中间件,具有高吞吐量、高可用性和强大的扩展性,因此在构建大规模、高可靠性的应用系统时备受推崇。而在使用RocketMQ时,为了更好地了解消息的流动和监控,RocketMQ Dashboard成为了一个不可或缺的可视化工具。本篇博客将带大家一步步在Linux系统中安装RocketMQ,并介绍如何配置和使用RocketMQ Dashboard。

编码人生 3382

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

Transformer实战(38)——视觉Transformer (Vision Transformer, ViT)

Transformer 在自然语言处理 (NLP) 领域取得了显著成就,在许多不同的任务中都表现出色。在本节中,我们将探索视觉 Transformer (Vision Transformer, ViT) 模型。正如 NLP 领域创建了多种模型一样,视觉领域也开发了多种模型,每种模型都为计算机视觉提供了新的视角。通过本节,将学习如何使用 ViT 等模型进行计算机视觉任务,了解基于 Transformer 的预训练计算机视觉模型的工作原理,以及如何针对特定任务进行微调。

盼小辉丶的博客 2831

java多线程下载_java多线程批量下载文件

多线程下载文件平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果:packagetest;/***文件下载类* @author luweicheng**/import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import j...

weixin_31970409的博客 1441

交换机端口模式详解:Access、Hybrid、Trunk

交换机是网络中至关重要的组件之一,用于连接各种设备并启用数据的高效流动。为了更好地管理和控制网络流量,交换机提供了不同的端口模式,其中包括Access、Hybrid和Trunk。本文将深入探讨这三种端口模式,详细解释它们的配置、特性和应用场景,以帮助网络管理员更好地理解和优化网络架构。

网络技术联盟站 4014

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java多线程下载_java多线程下载实例详解

本文实例讲述了java多线程下载。分享给大家供大家参考,具体如下:使用多线程下载文件可以更快完成文件的下载,多线程下载文件之所以快,是因为其抢占的服务器资源多。如:假设服务器同时最多服务100个用户,在服务器中一条线程对应一个用户,100条线程在计算机中并非并发执行,而是由CPU划分时间片轮流执行,如果A应用使用了99条线程下载文件,那么相当于占用了99个用户的资源,假设一秒内CPU分配给每条线程...

weixin_36068015的博客 531

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

百度云 java 多线程下载_Java多线程下载

我是新人,要喷请轻喷本来准备搞个java多线程下载器,在网上搜索一遍,全都是用的apache做的,我比较懒,就想如何才能不用apache搞一个出来,先搞了一个单线程的出来,用java自带的.net包搞定,成功完成了下载,废话不多说,下面上源码:/*** 完成单线程的下载任务*/package net.meteor.download;import java.io.File;import java.i...

weixin_29997937的博客 217

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 多线程 文件下载_Java多线程下载文件

导读热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public cla...

weixin_42319396的博客 242

Java多线程下载分析

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

guanshengg的博客 311

Java多线程下载图片

Java多线程下载图片添加commons-io插件编写多线程下载图片代码 添加commons-io插件 这里使用apache的commons-io包下的FileUtils工具类进行图片下载(官方API文档)。 首先下载commons-io插件包并解压(下载地址): 选中project,右键新建一个名为lib的文件夹: 将下载好的commons-io插件包中的commons-io-2.6.jar和commons-io-2.6-sources.jar两个文件,粘贴到新建的lib文件夹中: 选中common

Jason_Flash的博客 822

java 多线程 多个文件下载_java多线程实现文件下载功能

多线程下载文件的思路:1.首先获取到文件的总大小获取文件大小的方式是通过网络读取,getContentLength()即可获取到文件的大小,使用RandomAccessFile()支持随机访问2.根据所准备的线程数据,计算每一个线程需要下载的文件的大小上图显示下载400M的电影分4个线程下载,每一个线程分别下载各自数据段中的数据,第一个线程下载0-100M,第二个下载100M-200M之间的数据,...

weixin_42557768的博客 1461

Java多线程下载技术实现

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

zhaoyang10的专栏 4305

java多线程下载文件和断点下载

java多线程下载文件和断点下载 多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...

w1366352655的博客 341

java多线程文件下载_java多线程实现文件下载

本文实例为大家分享了java多线程实现文件下载的具体代码,供大家参考,具体内容如下1、DownloadManager类import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;impo...

weixin_34886207的博客 740
上一篇: 使用Jsoup 抓取页面的数据
下一篇: 20条Linux命令面试问题
老牛斯坦森
博客等级 码龄11年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值