Java+Demo 使用java的URLConnection类下载网络文件和支持断网断点续传的简单应用

news2025/1/2 4:21:20

记录一下使用java的URLConnection类和File类下载网络文件和支持断网断点续传的简单方式

java URLConnection类的结构
myw
demo代码假设下载python的安装包

https://www.python.org/ftp/python/3.10.8/python-3.10.8-amd64.exe

FileDownloadUtilsDemo1.java

package boot.example.file.download;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 *  蚂蚁舞
 */
public class FileDownloadUtilsDemo1 {


    // 下载保存的目录 windows系统
    public static String localFileName = "D:/MywFileDownLoad/";

    public static void main(String[] args) throws IOException {

        String urlStr = "https://www.python.org/ftp/python/3.10.8/python-3.10.8-amd64.exe";
        downloadFileResourceContinuation(urlStr);
    }

    public static void downloadFileResourceContinuation(String urlStr){

        try {
            // 确认本地文件夹是否存在 如果文件夹不存在 自动创建文件夹 创建失败抛出异常
            File fileFolder = new File(localFileName);
            if (!fileFolder.exists() && !fileFolder.isDirectory()) {
                boolean b = fileFolder.mkdirs();
                if(!b) {
                    throw new Exception("创建目录失败");
                }
            }


            // 验证或获取文件的长度
            long start = 0; // 默认给0
            long end = getFileResourceLength(urlStr);  // 远端获取长度
            System.out.println("文件长度:"+end);
            // 创建网络资源并且获取到连接对象
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 从url对象中获取获得文件名 默认最后一个/后面的就是需要下载的文件资源 这种方式一般不会有问题 当然也可以把目录和文件资源名分开
            String file = url.getFile();
            String name = file.substring(file.lastIndexOf('/') + 1);

            // 去本地文件夹获取该文件 如果存在该文件则判断该文件是否需要再次下载或断点续传
            File localFile = new File(localFileName+name);
            if(localFile.exists()){
                start = localFile.length();
                if(start == end){  // 如果相等  那么默认就是下载完成了的
                    System.out.println("已经下载完成了,无需再次下载");
                    return;
                }
            }

            // 定义请求范围长度 开始到结束  如果start不是0 那就是断点续传的
            String range = "bytes=" + start + "-";
            if (end > 0) {
                range = range+end;
            }
            System.out.println(range);

            connection.setRequestProperty("RANGE", range);
            connection.setRequestProperty("User-Agent", "NetFox");
            connection.setRequestMethod("GET");
            connection.setReadTimeout(60*1000);
            connection.setConnectTimeout(60*1000);
            connection.connect();// 连接网络资源

            // 要下载文件 这里得到的返回code是206 如果不是206 那么就直接抛出异常失败处理
            // System.out.println(connection.getResponseCode()+"--"+connection.getResponseMessage());
            if(206 != connection.getResponseCode()){
                throw new Exception("获取文件失败!");
            }
            // 拿到连接后的输入流对象 以及创建本地保存下载资源的输出流对象
            InputStream in = connection.getInputStream();
            FileOutputStream out = new FileOutputStream(localFileName+name, true);
            byte[] buff = new byte[2048];
            int len = in.read(buff);
            while (len != -1) {
                out.write(buff, 0, len);
                len = in.read(buff);
            }
            out.close();
            in.close();
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取待下载文件的长度
    public static long getFileResourceLength(String urlResource) throws IOException {
        URL url=new URL(urlResource);
        URLConnection urlConnection=url.openConnection();
        urlConnection.connect();
        return urlConnection.getContentLength();
    }



}

启动main后可以看到控制台
myw
在这里我们把java启动的main关停,相当于网络断了,可以看到下载的文件夹里的python不完整,那么重新启动main
myw
myw
可以看到demo程序是根据之前的断点直接续传的 等待继续下载
等待程序下载结束之后可以再次运行demo的main
myw
可以看到下载确实完成了
myw
运行之后,下载的python没问题
python的网络在国外,下载可能很慢 测试可以使用国内的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARMv8 编程】A64 系统控制和其他指令

A64 指令集包含与以下相关的指令: 异常处理。系统寄存器访问。调试。提示指令,在许多系统中都有电源管理应用程序。 一、异常处理指令 存在三个异常处理指令,其目的是引发异常。这些用于调用在操作系统(EL1)、Hyper…

004、PG实例结构

实例结构 1、PostgreSQL实例2、建立一个连接和创建一个会话3、初始化参数文件4、postgresql.conf参数文件5、postgresql.auto.conf参数文件6、参数生效条件7、Memory Architecture8、Process Architecture9、Postgres Server Process10、Backend Processes11、Background Proce…

Linux:split命令、paste命令、ecal命令和正则表达式

Linux:split命令、paste命令、ecal命令和正则表达式 一、split命令二、paste命令三、eval命令四、正则表达式五、实验与应用 一、split命令 split命令—Linux下将一个大的文件拆分成若干小文件语法格式 split 选项 参数 原始文件 拆分后文件名前缀常用选项 选项说…

Claude不能用了?我来帮你

前几天,我在《不需要等待列表,也不用魔法上网的Claude,能否比肩ChatGPT?》一文中,介绍了ChatGPT的同门师兄Claude的注册使用教程。许多同学按照我的教程,很快就无痛使用上了类似ChatGPT的服务。 403 Forbid…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(二)(共识网络分析-第二步-构建网络与模块-分步法)

1写在前面 不知道各位最近过得怎么样,昨天去修了脚🦶,感觉自己马上就要迈入油腻中年人的行列了。🥲 不过说实话,还是挺舒服的,值得再去一次。😅 接着更一下WGCNA的教程吧,还是值得大…

TypeScript-基础类型

目录 介绍 布尔值 数字 字符串 数组 元组 Tuple 枚举 Unknown Any Void Null 和 Undefined Never Object 类型断言 关于 Number, String, Boolean, Symbol 和 Object 介绍 在TypeScript中,我们能够处理一些数据单元,例如:数字…

【JavaWeb】-- HTML、CSS、JavaScript

文章目录 HTML1.基本介绍2.快速入门3.基础标签3.1 标题标签3.2 hr标签3.3 字体标签3.4 加粗、斜体、下划线标签3.5 居中标签 4.图片、音频、视频标签5.超链接标签6.列表标签7.表格标签8.布局标签9.表单标签9.1 表单标签概述9.2 form标签属性9.3 代码演示 10.表单项标签 CSS1.概…

【Prompting】ChatGPT Prompt Engineering开发指南(5)

ChatGPT Prompt Engineering开发指南:Transforming 翻译通用翻译器音调转换格式转换拼写检查/语法检查内容来源 在本教程中,我们将探讨如何使用大型语言模型来进行文本转换任务,例如语言翻译,拼写和语法检查,音调调整和…

怎么画邻接表?不用邻接矩阵也能画?

目录 一、有向图的邻接表 二、无向图的邻接表 一、有向图的邻接表 最简单粗暴的方式就是把某个顶点发出的箭头指向的顶点全作为单个结点连接到此顶点的后面。结点数等于边数。 按正常思路的话,是一种递归遍历。 1.选一个点作为出发点。比如选一个v0。 2.从第一出…

Kali-linux控制Meterpreter

Meterpreter是Metasploit框架中的一个杀手锏,通常作为利用漏洞后的攻击载荷所使用,攻击载荷在触发漏洞后能够返回给用户一个控制通道。当使用Armitage、MSFCLI或MSFCONSOLE获取到目标系统上的一个Meterpreter连接时,用户必须使用Meterpreter传…

【C++】leetcode力扣 剑指 Offer 题解

文章预览: 剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题…

大模型训练数据多样性的重要性

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

图形编程周刊(2023.001)

图形编程周刊(2023.001) key: webgpu webgl 3d webgis three.js cesium.js 这里是力博荣(Libaro)三维可视化带来的 图形编程周刊, 争取每周五发布。 更新源位置: https://gitee.com/lianming/graphics-programming-weekly/blob/master/2023001/2023001.md 发现的代码 1、th…

少儿编程 中国电子学会图形化编程等级考试Scratch编程三级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试三级真题 判断题(共10题,每题2分,共20分) 26、单击如图所示积木,将生成一个介于1.5和2.5之间的一位小数 答案:错 考点分析:考查随机数积木的使用,随机生成小数的时候,生成的小数位不止一位,所以错误 27、为新建变量命名时,不区分大小…

红黑树封装map和set

文章目录 红黑树封装map和set1. 改良红黑树1.1 改良后的节点1.2 改良后的类分别添加仿函数代码 3. 封装map和set3.1 set3.2 map 3. 迭代器3.1 begin 和 end3.2 operator()和operator--()3.3 const迭代器set的迭代器map的迭代器 4. map的operator[]的重载5. 完整代码实现5.1 RBT…

美团二面:聊聊ConcurrentHashMap的存储流程

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

手把手教你彻底卸载MySQL

❤写在前面 ❤博客主页:努力的小鳴人 ❤系列专栏:MySQL8.0基础学习 ❤欢迎小伙伴们,点赞👍关注🔎收藏🍔一起学习! ❤如有错误的地方,还请小伙伴们指正!🌹 ​ …

抖音SEO矩阵系统源码开发搭建(一)

抖音SEI矩阵系统源码开发,需要遵循一下步骤: 1. 确定需求和功能:明确系统的主要目标和需要实现的功能,包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构:根据需求和功能确定系…

Golang每日一练(leetDay0068) 二叉树右视图、岛屿数量

目录 199. 二叉树的右视图 Binarytree Right Side View 🌟🌟 200. 岛屿数量 Number-of-islands 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…

【C++】图解类和对象(中)

类和对象(中) 文章目录 类和对象(中)一、类的6个默认成员函数二、构造函数1.定义2.特性3.对特性的理解及几点注意事项 二、析构函数总结 一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的…