返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现断点续传功能的示例代码
  • 841
分享到

Java实现断点续传功能的示例代码

Java实现断点续传Java断点续传 2022-11-13 18:11:03 841人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节

一、题目描述

题目实现:网络资源的断点续传功能。

二、解题思路

获取要下载的资源网址

显示网络资源的大小

上次读取到的字节位置以及未读取的字节数

输入下载的起始位置和结束位置,开始下载网络资源

如果没有下载完成,可以接着上次的下载位置继续下载

创建一个类:BreakPointSuperveneFrame,继承JFrame窗体类。

定义一个download()方法:用于实现网络资源的断点续传。

核心重点:通过设置请求参数RANGE实现,通过RANGE参数可以指定下载网络的字节区间,从而可以实现每次下载部分网络资源的功能

例如:将该参数设置为“RANGEbytes=0-1024”,就表示将网络资源中从0~1024之间的内容下载到客户机;如果将该参数设置为“RANGE:bytes=1024-”,就表示将网络资源中从1024到结束位置的内容全部下载到客户机。

测试下载这个链接

三、代码详解

BreakPointSuperveneFrame

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalfORMedURLException;
import java.net.URL;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class BreakPointSuperveneFrame extends JFrame {
    private JTextField tf_totalLength;
    private JTextField tf_residuaryLength;
    private JTextField tf_readToPos;
    private JTextField tf_address;
    private JTextField tf_endPos;
    private JTextField tf_startPos;
    private String urlAddress = "";// 用于存储网络资源的地址
    private long totalLength = 0;// 存储网络资源的大小,以字节为单位
    private long readToPos = 0;// 存储上次读取到的位置
    private long residuaryLength = 0;// 存储未读内容的大小

    
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    BreakPointSuperveneFrame frame = new BreakPointSuperveneFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    
    public BreakPointSuperveneFrame() {
        super();
        getContentPane().setLayout(null);
        setTitle("下载网络资源的断点续传");
        setBounds(100, 100, 514, 238);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        tf_startPos = new JTextField();
        tf_startPos.setBounds(80, 165, 113, 22);
        getContentPane().add(tf_startPos);

        final JLabel label = new JLabel();
        label.setText("起始位置:");
        label.setBounds(10, 167, 74, 18);
        getContentPane().add(label);

        final JLabel label_1 = new JLabel();
        label_1.setText("结束位置:");
        label_1.setBounds(199, 167, 74, 18);
        getContentPane().add(label_1);

        tf_endPos = new JTextField();
        tf_endPos.setBounds(267, 165, 117, 22);
        getContentPane().add(tf_endPos);

        final JLabel label_2 = new JLabel();
        label_2.setText("网络资源的地址:");
        label_2.setBounds(10, 52, 113, 18);
        getContentPane().add(label_2);

        tf_address = new JTextField();
        tf_address.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                try {
                    urlAddress = tf_address.getText().trim();
                    URL url = new URL(urlAddress);// 获得网络资源的URL
                    HttpURLConnection connection = (HttpURLConnection) url
                            .openConnection();// 获得连接对象
                    connection.connect();// 连接网络资源
                    totalLength = connection.getContentLength();// 获得网络资源的长度
                    connection.disconnect();// 断开连接
                    tf_totalLength.setText(String.valueOf(totalLength));// 显示总长度
                    tf_readToPos.setText("0");// 显示上次读取到的位置
                    residuaryLength = totalLength;// 未读内容为文件总长度
                    tf_residuaryLength.setText(String.valueOf(residuaryLength));// 显示未读内容
                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }

            }
        });
        tf_address.setBounds(119, 50, 365, 22);
        getContentPane().add(tf_address);

        final JLabel label_3 = new JLabel();
        label_3.setForeground(new Color(0, 0, 255));
        label_3.setFont(new Font("", Font.BOLD, 14));
        label_3.setText("输入网络资源的地址并回车,可以获得网络资源的大小。");
        label_3.setBounds(10, 10, 384, 22);
        getContentPane().add(label_3);

        final JLabel label_4 = new JLabel();
        label_4.setForeground(new Color(128, 0, 0));
        label_4.setText("网络资源的大小为");
        label_4.setBounds(10, 76, 113, 38);
        getContentPane().add(label_4);

        final JLabel label_5 = new JLabel();
        label_5.setText("上次读取到");
        label_5.setBounds(10, 123, 74, 18);
        getContentPane().add(label_5);

        tf_readToPos = new JTextField();
        tf_readToPos.setBounds(80, 121, 113, 22);
        tf_readToPos.setEnabled(false);
        getContentPane().add(tf_readToPos);

        final JLabel label_6 = new JLabel();
        label_6.setText("字节处,还剩");
        label_6.setBounds(202, 123, 87, 18);
        getContentPane().add(label_6);

        tf_residuaryLength = new JTextField();
        tf_residuaryLength.setBounds(285, 120, 117, 22);
        tf_residuaryLength.setEnabled(false);
        getContentPane().add(tf_residuaryLength);

        final JLabel label_7 = new JLabel();
        label_7.setText("字节未读。");
        label_7.setBounds(404, 123, 80, 18);
        getContentPane().add(label_7);

        final JLabel label_4_1 = new JLabel();
        label_4_1.setForeground(new Color(128, 0, 0));
        label_4_1.setText("个字节。");
        label_4_1.setBounds(404, 76, 80, 38);
        getContentPane().add(label_4_1);

        tf_totalLength = new JTextField();
        tf_totalLength.setBounds(119, 84, 283, 22);
        tf_totalLength.setEnabled(false);
        getContentPane().add(tf_totalLength);

        final JButton button = new JButton();
        button.setBounds(395, 162, 89, 28);
        getContentPane().add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                if (totalLength == 0) {
                    JOptionPane.showMessageDialog(null,
                            "没有网络资源。\n\n请输入正确的网址,然后回车。");
                    return;
                }
                long startPos = 0;// 起始位置
                long endPos = 0;// 结束位置
                try {
                    startPos = Long.parseLong(tf_startPos.getText().trim());// 起始位置
                    endPos = Long.parseLong(tf_endPos.getText().trim());// 结束位置
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "输入的起始位置或结束位置不正确。");
                    return;
                }
                readToPos = endPos;// 记录读取到的位置
                residuaryLength = totalLength - readToPos;// 记录未读内容的大小
                tf_readToPos.setText(String.valueOf(readToPos));// 显示读取到的位置
                tf_residuaryLength.setText(String.valueOf(residuaryLength));// 显示未读字节数
                tf_startPos.setText(String.valueOf(readToPos));// 设置下一个读取点的开始位置
                tf_endPos.setText(String.valueOf(totalLength));// 设置下一个读取点的结束位置
                tf_endPos.requestFocus();// 使结束位置文本框获得焦点
                tf_endPos.selectAll();// 选择结束位置文本框中的全部内容,方便输入结束位置值
                download(startPos, endPos);// 调用方法进行下载
            }
        });
        button.setText("开始下载");
    }

    public void download(long startPosition, long endPosition) {
        try {
            URL url = new URL(urlAddress);// 获得网络资源的URL
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();// 获得连接对象
            connection.setRequestProperty("User-Agent", "NetFox");// 设置请求属性
            String rangeProperty = "bytes=" + startPosition + "-";// 定义请求范围属性
            if (endPosition > 0) {
                rangeProperty += endPosition;// 调整请求范围属性
            }
            connection.setRequestProperty("RANGE", rangeProperty);// 设置请求范围属性
            connection.connect();// 连接网络资源
            InputStream in = connection.getInputStream();// 获得输入流对象
            String file = url.getFile();// 获得文件对象
            String name = file.substring(file.lastIndexOf('/') + 1);// 获得文件名
            FileOutputStream out = new FileOutputStream("d:/" + name, true);// 创建输出流对象,保存下载的资源
            byte[] buff = new byte[2048];// 创建字节数组
            int len = 0;// 定义存储读取内容长度的变量
            len = in.read(buff);// 读取内容
            while (len != -1) {
                out.write(buff, 0, len);// 写入磁盘
                len = in.read(buff);// 读取内容
            }
            out.close();// 关闭流
            in.close();// 关闭流
            connection.disconnect();// 断开连接
            if (readToPos > 0 && readToPos == totalLength) {
                JOptionPane.showMessageDialog(null, "完成网络资源的下载。\n单击“确定”按钮退出程序。");
                System.exit(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

点击开始下载,提示要--》输入地址后回车

输入地址后回车,会获取文件的大小

尝试先下载 0-1024 ,下载后,会自动计算未下载的起始和结束位置。

下载后,写入本地文件,文件存储在D:盘目录下

下载成功提示:

文件存储在D:盘目录下

到此这篇关于Java实现断点续传功能的示例代码的文章就介绍到这了,更多相关Java断点续传内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现断点续传功能的示例代码

本文链接: https://lsjlt.com/news/169405.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现断点续传功能的示例代码
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节...
    99+
    2022-11-13
    Java实现断点续传 Java断点续传
  • Java实现断点下载功能的示例代码
    目录介绍效果前端代码后端代码介绍 当下载一个很大的文件时,如果下载到一半暂停,如果继续下载呢?断点下载就是解决这个问题的。 具体原理: 利用indexedDb,将下载的数据存储到用户...
    99+
    2024-04-02
  • Golang实现断点续传功能
    本文实例为大家分享了Golang实现断点续传的具体代码,供大家参考,具体内容如下 1、将文件pic_src.jpg复制到pic_des.jpg文件; 2、读写过程中断时,读写的中断位...
    99+
    2024-04-02
  • Android实现断点续传功能
    本文实例为大家分享了Android实现断点续传的具体代码,供大家参考,具体内容如下 断点续传功能,在文件上传中断时,下次上传同一文件时,能在上次的断点处继续上传,可节省时间和流量 总...
    99+
    2024-04-02
  • Flutter实现资源下载断点续传的示例代码
    目录协议梳理实现步骤写在最后协议梳理 一般情况下,下载的功能模块,至少需要提供如下基础功能:资源下载、取消当前下载、资源是否下载成功、资源文件的大小、清除缓存文件。而断点续传主要体现...
    99+
    2024-04-02
  • Java中怎么实现断点续传功能
    这篇文章给大家介绍Java中怎么实现断点续传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。(一)断点续传的原理   其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。   打个比方,浏览器请...
    99+
    2023-06-03
  • Android多线程断点续传下载功能实现代码
    原理 其实断点续传的原理很简单,从字面上理解,所谓断点续传就是从停止的地方重新下载。 断点:线程停止的位置。 续传:从停止的位置重新下载。 用代码解析就是: 断点:当...
    99+
    2022-06-06
    android多线程 断点续传 断点 线程 Android
  • 通过Java实现文件断点续传功能
    目录什么是断点续传解决方案效果演示参考代码前端后端什么是断点续传 用户上传大文件,网络差点的需要历时数小时,万一线路中断,不具备断点续传的服务器就只能从头重传,而断点续传就是,允许用...
    99+
    2024-04-02
  • 怎么通过Java实现文件断点续传功能
    这篇文章主要介绍“怎么通过Java实现文件断点续传功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么通过Java实现文件断点续传功能”文章能帮助大家解决问题。什么是断点续传用户上传大文件,网络差...
    99+
    2023-06-30
  • C#中怎么实现断点续传功能
    本篇文章为大家展示了C#中怎么实现断点续传功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以下是一个请求报文与相应的回复报文的例子:GET /image/index_r4_c1.jpg&...
    99+
    2023-06-17
  • js自己实现一个大文件切片上传+断点续传的示例代码
    目录首先我们来分析一下需求一、 格式校验二、 文件切片三、 断点续传 + 秒传 + 上传进度PM:喂,那个切图仔,我这里有个100G的视频要上传,你帮我做一个上传后台,下班前给我哦,...
    99+
    2024-04-02
  • HTML5如何实现文件断点续传功能
    这篇文章主要为大家展示了“HTML5如何实现文件断点续传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5如何实现文件断点续传功能”这篇文章吧。HTM...
    99+
    2024-04-02
  • java实现文件的断点续传
    所谓文件的断点续传,就是一个线程传输文件,另一个线程控制传输标识,以达到暂停文件效果、恢复文件上传的效果。 本demo使用最基本的线程之间的通信来实现一个简单的断点续传。 packa...
    99+
    2024-04-02
  • Node.js实现分片上传断点续传示例详解
    目录正文文件的分片与合并并发控制使代码可复用服务端接口实现正文 大文件上传会消耗大量的时间,而且中途有可能上传失败。这时我们需要前端和后端配合来解决这个问题。 解决步骤: 文件分片,...
    99+
    2024-04-02
  • android怎么实现多线程断点续传功能
    这篇文章主要介绍了android怎么实现多线程断点续传功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下布局:<xml version="...
    99+
    2023-05-30
    android 多线程
  • android原生实现多线程断点续传功能
    本文实例为大家分享了android实现多线程断点续传功能的具体代码,供大家参考,具体内容如下 需求描述: 输入一个下载地址,和要启动的线程数量,点击下载 利用多线程将文件下载到手机端...
    99+
    2024-04-02
  • Android(Java)下载断点续传的实现
    Android(Java)下载断点续传的实现一、要注意的地方1. 追加文件2. 跳过输入流3.range header坑点1.坑点2坑点3.二、...
    99+
    2022-06-06
    JAVA 断点续传 断点 Android
  • Node.js实现大文件断点续传示例详解
    目录前言方案分析具体解决流程html 部分script 部分node服务端 部分逻辑分析小结前言 平常业务需求:上传图片、Excel等,毕竟几M的大小可以很快就上传到服务器。 针对于...
    99+
    2022-11-13
    Node.js大文件断点续传 Node.js 文件断点续传
  • JavaSpringBoot实现文件上传功能的示例代码
    测试代码 pom.xml: <xml version="1.0" encoding="UTF-8"> <project xmlns="http://maven.ap...
    99+
    2024-04-02
  • Golang实现图片上传功能的示例代码
    目录1.前端代码2.JS代码3.后端代码该代码为使用beego实现前后端图片上传。话不多说,直接上代码。 1.前端代码 html代码: <div class="col-5 f...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作