多线程下载之断点续传采用随机文件读取流,HttpConnection实现

大文件上传如何做断点续传?全端+后端结合开发 断点续传(Resumable File Upload)是一种文件上传的技术,它允许在上传过程中出现中断或失败的情况下,能够从中断的位置继续上传,而不需要重新上传整个文件。这在处理大文件或不稳定的网络连接时非常有用。 阅读详情

/**
*
*/
package com.l000phone.multithreaddown.advanced;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* Description: 多线程从服器端下载资源演示(网络出现异常,需要进行断点续传)

* Copyright (c) , 2016, Jansonxu

* This program is protected by copyright laws.

* Program Name:Download.java

* Date: 2016-2-16
*
* @author 李阳
* @version : 1.0
*/
public class AdvancedDownload {

/**
 * @param args
 */
public static void main(String[] args) {
    // 1、在客户端获得服务器资源的长度,根据此长度在客户端创建一个临时文件
    try {
        URL url = new URL(
                "http://localhost:8080/ServerSide/file/VNC-5.1.1-Windows.exe");

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            int resLen = conn.getContentLength();
            System.out.println("要下载资源的长度是:" + resLen);

            RandomAccessFile raf = new RandomAccessFile(new File(
                    "download/VNC-5.1.1-Windows.exe"), "rwd");// 创建临时文件

            raf.setLength(resLen);
            raf.close();// 关闭资源

            // 2、获得每个线程下载资源的开始和结束位置
            // 3、开启多个线程从服务其下载资源,直到所有的线程执行完毕
            int blockSize = resLen / 3;// 每个线程平均下载的长度

            AdvancedDownload outer = new AdvancedDownload();// 外部类对象

            // 创建文件对象(记录各个子线程下载的最终结果)
            File threadDownadStatusFile = new File(
                    "download/finalStauts.txt");
            if (!threadDownadStatusFile.exists()) {
                threadDownadStatusFile.createNewFile();
            }

            for (int threadId = 1; threadId <= 3; threadId++) {
                // ①开始位置
                int startPos = (threadId - 1) * blockSize;

                // ②结束位置
                int endPos = threadId * blockSize - 1;

                if (threadId == 3) {
                    endPos = resLen - 1;
                }
                // ③启动子线程下载
                outer.new DownloadSonThread(startPos, endPos, url,
                        threadId, threadDownadStatusFile).start();
            }

        }

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

}

/**
 * 资源下载子线程
 */
private class DownloadSonThread extends Thread {
    private int startPos;
    private int endPos;
    private URL url;
    private int threadId;
    private File threadDownadStatusFile;

    public DownloadSonThread(int startPos, int endPos, URL url,
            int threadId, File threadDownadStatusFile) {
        super();
        this.startPos = startPos;
        this.endPos = endPos;
        this.url = url;
        this.threadId = threadId;
        this.threadDownadStatusFile = threadDownadStatusFile;
    }

    @Override
    public void run() {
        // ①获得连接实例
        try {
            HttpURLConnection conn = (HttpURLConnection) url
                    .openConnection();

            // 读取线程字节数记录文件中的数据,作为开始线程下载的开始位置
            File file = new File("download/" + threadId + ".txt");
            if (file.exists()) {
                BufferedReader br = new BufferedReader(new FileReader(file));
                String startPosRecord = br.readLine();
                startPos = Integer.parseInt(startPosRecord);
                br.close();
            }

            // ②设置连接的属性为下载部分资源
            conn.setRequestProperty("Range", "bytes=" + startPos + "-"
                    + endPos);

            System.out.println("来自服务器端的状态码:" + conn.getResponseCode());

            // ③从服务器获取资源,填充本地客户端的临时文件
            if (conn.getResponseCode() == 206) {// 206:服务器端的资源是属于分段下载的、200:服务端所有的资源都发送给了客户端
                // a)获得网络字节输入流
                InputStream is = conn.getInputStream();
                byte[] b = new byte[1024];
                int len = 0;

                // b)将流中的数据写入到本地临时文件中

                RandomAccessFile raf = new RandomAccessFile(new File(
                        "download/VNC-5.1.1-Windows.exe"), "rwd");// 向临时文件中写入数据
                raf.seek(startPos);

                int totalBytes = startPos;// 当前线程已经下载的字节数
                while ((len = is.read(b)) != -1) {
                    // seek移动指针偏移量,写入数据
                    raf.write(b, 0, len);
                    totalBytes += len;// 累加目前已经下载的字节数
                    RandomAccessFile nowRecordLenFile = new RandomAccessFile(
                            new File("download/" + threadId + ".txt"),
                            "rwd");
                    nowRecordLenFile.write((totalBytes + "").getBytes());
                    nowRecordLenFile.close();
                }
                raf.close();
                System.out.println("线程" + threadId + "下载资源完毕....");
                FileWriter fw = new FileWriter(threadDownadStatusFile, true);
                fw.write(threadId + "over");
                fw.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 读取文件中的内容,若发现内容匹配:
            // 内容.contains("thread1over") 并且 内容.contains("thread2over") 并且
            // 内容.contains("thread3over")
            // 就删除各个临时文件
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader(
                        threadDownadStatusFile));
                String finalResultInfo = br.readLine();
                if (finalResultInfo.contains("1over")
                        && finalResultInfo.contains("2over")
                        && finalResultInfo.contains("3over")) {
                    for (int threadId = 1; threadId <= 3; threadId++) {
                        new File("download/" + threadId + ".txt").delete();
                    }

                    br.close();

                    new File("download/finalStauts.txt").delete();

                    System.out.println("恭喜!所有临时文件都已经删除掉了哦!...");
                }

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

        }

    }
}

}

多线程下载使用到的是随机文件访问类 多线程下载使用到的是随机文件访问类 多线程下载使用到的是随机文件访问类 多线程下载使用到的是随机文件访问类 立即下载

相关推荐

axios离线文件

vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,可以直接引用这个文件,不必在线引用。

使用axios 封装大文件上传,支持断点续传的功能

在许多应用程序中,我们经常需要上传大文件。但是,由于网络连接不稳定或其他原因,上传过程可能会中断。为了解决这个问题,我们可以使用断点续传功能。断点续传允许我们在上传中断后从中断处继续上传文件,而无需重新上传整个文件。除了断点续传,我们还可以使用重试、暂停和开始功能来更好地控制上传过程。重试功能允许我们在上传失败时自动重试上传。暂停功能允许我们暂停正在进行的上传。开始功能允许我们开始新的上传。此外,我们还可以使用上传进度功能来实时跟踪上传进度。这对于大文件上传非常有用,因为它可以让我们知道上传的进展情况。

weixin_42657666的博客 1622

基于axios方式的文件下载!!

通过axios下载文件,不跳转页面,可以添加其他参数进行验证。

文件上传 切片与断点续传

文件上传

weixin_49210760的博客 1230

多线程随机读取文件

多线程随机读取文件RandomAccessFile

训练集、验证集、测试集!YOLO系列标签数量统计!

【代码】训练集、验证集、测试集!YOLO系列标签数量统计!

qq_26281057的博客 652

【axios】axios下载二进制excel文件如何做到中断续传

请求头,同时确保文件内容正确的传输和续传。前端的断点续传实际上是基于服务器端的支持和协议的。3、在现有的下载函数中添加中断和续传的支持,可以使用 range 请求头来控制请求的块位置。1、在开始下载之前,确保您的项目中已经使用了 Axios(可以通过使用 npm 或者 yarn 进行安装)。2、创建一个用于下载的函数,并使用 axios.get() 来发起文件下载请求。通过以上修改,下载函数将会检查是否已存在输出文件。请求头指定从已下载的文件大小开始继续下载,实现了中断和续传的功能。

hzxOnlineOk的博客 857

SIwave仿真手册——信号完整性仿真之S参数的提取(二)

上一篇简单了讲述了软件的各个操作界面,本次博客更新关于的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。

luohuo9844的博客 1万+

vue项目性能优化——断点续传

用element-ui提供基于文件流的上传方案: 2、基于BASE64的上传方案 二、如何实现断点续传? 1、拿到文件,对文件进行切片,有两个方式,一种时固定数量,另一种时固定大小。 2、用SparkMD5库对每一个分片进行命名(服务器接口后,会对相同hash的文件进行合并) 3、发请求传文件,可以有串行和并行两种方式。这里使用串行,一个一个发,方便点击暂停上传的时候取消发送。 4、可以拿一个数组保存待发的文件,上传成功的文件可以从数组里面删除。这样,当再次点击继续发送的时候,就不需要重复发送了。 5、

weixin_42936434的博客 5090

从零构建HFSS连接器仿真模型:以SMP接口的精准复现为例

本文详细介绍了如何从零构建HFSS连接器仿真模型,以SMP接口的精准复现为例。通过获取官方模型、导入技巧、信号路径提取和介质结构复现等步骤,帮助工程师避免常见错误,提升高频电路仿真的准确性。文章特别强调了模型精度对仿真结果的影响,并提供了实用的调试和管理建议。

weixin_29041767的博客 432

COMSOL仿真分析高压直流GIS/GIL绝缘性能优化

高压直流气体绝缘设备(GIS/GIL)的绝缘性能是保障电网可靠运行的关键。通过COMSOL Multiphysics多物理场仿真,可以深入分析气固界面电场分布与电荷积聚机理。该技术结合静电场、热场和电荷传输耦合计算,能准确模拟温度梯度对SF6气体与环氧树脂界面特性的影响。工程实践中,这类仿真可优化导体结构设计、改进绝缘材料配方,并建立电场-温度关联预警模型。特别是在80℃高温工况下,仿真显示界面电荷密度会显著增加23%,这对设备安全运行具有重要指导价值。

weixin_32075843的博客 194

Python多线程下载器开发与AI辅助实践

文件下载是网络编程中的基础需求,其核心原理是通过HTTP协议实现资源传输。现代下载器采用流式处理和多线程技术来提升性能,其中断点续传通过Range请求头实现分块传输,多线程加速则依赖并发下载文件不同区段。Python生态中http.client比requests更适合大文件下载,能显著降低70%内存占用。结合AI代码生成能力,开发者可以快速实现包含进度显示、异常重试等专业功能的下载器,特别适用于爬虫、数据同步等需要批量下载的场景。本文演示的AI辅助开发模式,通过精准需求描述和迭代优化,大幅提升了Python

weixin_30251829的博客 298

6 赫斯曼网管软件industrial hivision用户管理

文章目录前言一、打开Industrial HiVision服务器二、在用户管理界面添加策略三、使用可选策略四、接受策略总结 前言 安装 Industrial HiVision 后,所有人都能广泛使用程序。安全起见,请进行相 关配置,对访问权限进行限制。 本文主要介绍用户管理基于某种角色模型。在访问角色中定义角色名称,通过分配访问权限给这些角色分配角色功能。例如,给管理人员自然要分配可用的权限,而观察员尽管可以登录,但没有能够进行更改的权限。Industrial HiVision 提供以下访问角色: 

t98746194的博客 1381

利用axios实现断点续传并支持进度条和取消上传

需求 文件上传,如果文件大小小于5M 则直接上传,否则需要切割文件,每个最大5M 大小进行上传。 技术选型 axios 服务器端提供的接口 /** * data:传参,是一个formData 对象 * processCallback :监听process的函数 * cancelFun :取消函数 */ function uploadFile(data, processCallback, can...

1799

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 564

Allegro技巧----相同模块复用实现快速布局

使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。 如图,有8个相同的ADC采样电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,如果一个个元器件布局很明显做了很多重复机械的劳动,效率低下;但是强大的Allegro软件早就考虑到了这点,只需要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,方便省事还美观。 具体步骤: 1.首先完成一个模块的PC

sinat_15677011的博客 5655

axios 使用2--全局配置、拦截器、取消请求、断点续传

1、基本使用 axios.method('url',[data],options) .then((res)=>{...}) .catch((err)=>{...}) eg: sendAjax(){ // 让组件具备axios对象 // axios.get||post|put|delete(url,options) axios.get('../axios/dat...

couch potato的博客 1156

【图像识别】基于计算机视觉实现红绿灯识别matlab代码

​ 1 简介 现如今,盲人出行依旧是一大问题.面对无处不在的红绿灯,盲人无法通过眼睛辨识红绿灯的状态,出行受阻.为了解决盲人识别红绿灯的难题,本文提出了一种基于MATLAB进行红绿灯识别的系统.对交通灯的识别主要基于对交通灯的色彩及形状特征.基于信号灯的亮度对其进行分割,提取,并设置了一种自动最优选择阈值的方法.再由HIS彩色空间的H信息识别颜色.最后根据二值化的交通灯的横坐标和纵坐标方向的投影进行形状匹配识别. 2 部分代码 clc clear all close all a=imread('m

qq_59747472的博客 2691

axios分段下载文件

之前遇到一个文件过大下载链接断开的问题,刚开始增加超时时间,效果并不好,后来经过各方面研究,上传都可以分段上传,下载也可以,所以和后端配合,实现了分段下载功能,现在把axios如何实现分段下载逻辑,总结成方法,以便以后参考。......

小小•愿望的博客 2580

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Axios 文件上传与下载终极指南:实现完整进度监控和断点续传功能

Axios 是一个基于 Promise 的 HTTP 客户端,专为浏览器和 Node.js 设计,提供了强大的文件上传和下载功能。作为现代 Web 开发中最受欢迎的 HTTP 请求库之一,Axios 能够轻松处理各种文件传输场景,包括进度监控、大文件分片上传和断点续传等高级功能。📁 ## 🔄 Axios 文件上传完整实现 使用 Axios 进行文件上传非常简单,通过 `FormData`

gitblog_00175的博客 941

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Vue项目中大文件切片上传实现秒传、断点续传的详细实现教程

本文将介绍如何在Vue项目中使用切片上传实现文件上传的高级功能,包括文件秒传、断点续传、错误重试、控制并发等,并且还将绘制一个上传进度条,让用户能够清晰地看到上传进度。同时,我们还将介绍如何通过一些优化措施,进一步提高上传效率。

weixin_63929524的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

分片上传与断点续传

分片上传与断点续传

weixin_64925940的博客 886

前端文件上传(文件上传,分片上传,断点续传)

如果需要重新上传该文件,则可以在下一次上传任务中,首先检查之前已上传的切片信息,如果存在已上传的切片,则可以直接跳过这些切片并进行后续的上传操作。具体实现方法可以根据上传任务的特点来确定,如将上传任务分为多个阶段,每个阶段上传一定数量的切片,如果某个阶段上传失败,则跳过该阶段并记录下失败的切片信息,待后续再进行重传。而通过分片上传,即使某个小块上传失败,只需要重新上传该小块,而不必重新上传整个文件。同时,如果某个小块上传失败,可以重试该小块,而不会影响其他小块的上传,从而提高上传的稳定性。

STATICHIT静砸的博客 7139

文件下载、上传和断点续传数据处理的公共基本方法

import axios from './axios' export const requestBaseUpload = (url, params, type = 'post', headers = { 'Content-Type': 'multipart/form-data' }, options = {}, loading = true) => { const data = new...

左手121 673

Android开发--多线程下载加断点续传

文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步。主要思路:         1.多线程下载:                首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount;得到每一段下载量;每一段的位

Joe_c 的专栏 2422
上一篇: java 之 集合遍历,存储结构,集合特点
下一篇: Android 解决异步任务下载图片错位问题
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值