最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼

 更新時(shí)間:2022年10月14日 16:00:41   作者:小虛竹and掘金  
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下

一、題目描述

題目實(shí)現(xiàn):網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳功能。

二、解題思路

獲取要下載的資源網(wǎng)址

顯示網(wǎng)絡(luò)資源的大小

上次讀取到的字節(jié)位置以及未讀取的字節(jié)數(shù)

輸入下載的起始位置和結(jié)束位置,開始下載網(wǎng)絡(luò)資源

如果沒有下載完成,可以接著上次的下載位置繼續(xù)下載

創(chuàng)建一個(gè)類:BreakPointSuperveneFrame,繼承JFrame窗體類。

定義一個(gè)download()方法:用于實(shí)現(xiàn)網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳。

核心重點(diǎn):通過設(shè)置請(qǐng)求參數(shù)RANGE實(shí)現(xiàn),通過RANGE參數(shù)可以指定下載網(wǎng)絡(luò)的字節(jié)區(qū)間,從而可以實(shí)現(xiàn)每次下載部分網(wǎng)絡(luò)資源的功能

例如:將該參數(shù)設(shè)置為“RANGEbytes=0-1024”,就表示將網(wǎng)絡(luò)資源中從0~1024之間的內(nèi)容下載到客戶機(jī);如果將該參數(shù)設(shè)置為“RANGE:bytes=1024-”,就表示將網(wǎng)絡(luò)資源中從1024到結(jié)束位置的內(nèi)容全部下載到客戶機(jī)。

測(cè)試下載這個(gè)鏈接

三、代碼詳解

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;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改后版本	        修改人		修改日期			修改內(nèi)容
 * 2022/5/29.1	    xiaoxuzhu		2022/5/29		    Create
 * </pre>
 * @date 2022/5/29
 */
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 = "";// 用于存儲(chǔ)網(wǎng)絡(luò)資源的地址
    private long totalLength = 0;// 存儲(chǔ)網(wǎng)絡(luò)資源的大小,以字節(jié)為單位
    private long readToPos = 0;// 存儲(chǔ)上次讀取到的位置
    private long residuaryLength = 0;// 存儲(chǔ)未讀內(nèi)容的大小

    /**
     * Launch the application
     *
     * @param args
     */
    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();
                }
            }
        });
    }

    /**
     * Create the frame
     */
    public BreakPointSuperveneFrame() {
        super();
        getContentPane().setLayout(null);
        setTitle("下載網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳");
        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("結(jié)束位置:");
        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("網(wǎng)絡(luò)資源的地址:");
        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);// 獲得網(wǎng)絡(luò)資源的URL
                    HttpURLConnection connection = (HttpURLConnection) url
                            .openConnection();// 獲得連接對(duì)象
                    connection.connect();// 連接網(wǎng)絡(luò)資源
                    totalLength = connection.getContentLength();// 獲得網(wǎng)絡(luò)資源的長(zhǎng)度
                    connection.disconnect();// 斷開連接
                    tf_totalLength.setText(String.valueOf(totalLength));// 顯示總長(zhǎng)度
                    tf_readToPos.setText("0");// 顯示上次讀取到的位置
                    residuaryLength = totalLength;// 未讀內(nèi)容為文件總長(zhǎng)度
                    tf_residuaryLength.setText(String.valueOf(residuaryLength));// 顯示未讀內(nèi)容
                } 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("輸入網(wǎng)絡(luò)資源的地址并回車,可以獲得網(wǎng)絡(luò)資源的大小。");
        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("網(wǎng)絡(luò)資源的大小為");
        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("字節(jié)處,還剩");
        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("字節(jié)未讀。");
        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("個(gè)字節(jié)。");
        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,
                            "沒有網(wǎng)絡(luò)資源。\n\n請(qǐng)輸入正確的網(wǎng)址,然后回車。");
                    return;
                }
                long startPos = 0;// 起始位置
                long endPos = 0;// 結(jié)束位置
                try {
                    startPos = Long.parseLong(tf_startPos.getText().trim());// 起始位置
                    endPos = Long.parseLong(tf_endPos.getText().trim());// 結(jié)束位置
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "輸入的起始位置或結(jié)束位置不正確。");
                    return;
                }
                readToPos = endPos;// 記錄讀取到的位置
                residuaryLength = totalLength - readToPos;// 記錄未讀內(nèi)容的大小
                tf_readToPos.setText(String.valueOf(readToPos));// 顯示讀取到的位置
                tf_residuaryLength.setText(String.valueOf(residuaryLength));// 顯示未讀字節(jié)數(shù)
                tf_startPos.setText(String.valueOf(readToPos));// 設(shè)置下一個(gè)讀取點(diǎn)的開始位置
                tf_endPos.setText(String.valueOf(totalLength));// 設(shè)置下一個(gè)讀取點(diǎn)的結(jié)束位置
                tf_endPos.requestFocus();// 使結(jié)束位置文本框獲得焦點(diǎn)
                tf_endPos.selectAll();// 選擇結(jié)束位置文本框中的全部?jī)?nèi)容,方便輸入結(jié)束位置值
                download(startPos, endPos);// 調(diào)用方法進(jìn)行下載
            }
        });
        button.setText("開始下載");
    }

    public void download(long startPosition, long endPosition) {
        try {
            URL url = new URL(urlAddress);// 獲得網(wǎng)絡(luò)資源的URL
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();// 獲得連接對(duì)象
            connection.setRequestProperty("User-Agent", "NetFox");// 設(shè)置請(qǐng)求屬性
            String rangeProperty = "bytes=" + startPosition + "-";// 定義請(qǐng)求范圍屬性
            if (endPosition > 0) {
                rangeProperty += endPosition;// 調(diào)整請(qǐng)求范圍屬性
            }
            connection.setRequestProperty("RANGE", rangeProperty);// 設(shè)置請(qǐng)求范圍屬性
            connection.connect();// 連接網(wǎng)絡(luò)資源
            InputStream in = connection.getInputStream();// 獲得輸入流對(duì)象
            String file = url.getFile();// 獲得文件對(duì)象
            String name = file.substring(file.lastIndexOf('/') + 1);// 獲得文件名
            FileOutputStream out = new FileOutputStream("d:/" + name, true);// 創(chuàng)建輸出流對(duì)象,保存下載的資源
            byte[] buff = new byte[2048];// 創(chuàng)建字節(jié)數(shù)組
            int len = 0;// 定義存儲(chǔ)讀取內(nèi)容長(zhǎng)度的變量
            len = in.read(buff);// 讀取內(nèi)容
            while (len != -1) {
                out.write(buff, 0, len);// 寫入磁盤
                len = in.read(buff);// 讀取內(nèi)容
            }
            out.close();// 關(guān)閉流
            in.close();// 關(guān)閉流
            connection.disconnect();// 斷開連接
            if (readToPos > 0 && readToPos == totalLength) {
                JOptionPane.showMessageDialog(null, "完成網(wǎng)絡(luò)資源的下載。\n單擊“確定”按鈕退出程序。");
                System.exit(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

點(diǎn)擊開始下載,提示要--》輸入地址后回車

輸入地址后回車,會(huì)獲取文件的大小

嘗試先下載 0-1024 ,下載后,會(huì)自動(dòng)計(jì)算未下載的起始和結(jié)束位置。

下載后,寫入本地文件,文件存儲(chǔ)在D:盤目錄下

下載成功提示:

文件存儲(chǔ)在D:盤目錄下

到此這篇關(guān)于Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼的文章就介紹到這了,更多相關(guān)Java斷點(diǎn)續(xù)傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)字符串反轉(zhuǎn)案例

    java實(shí)現(xiàn)字符串反轉(zhuǎn)案例

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)字符串反轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • java獲取圖片的大小、寬度、高度方式

    java獲取圖片的大小、寬度、高度方式

    文章介紹了如何將File對(duì)象轉(zhuǎn)換為MultipartFile對(duì)象的過程,并分享了個(gè)人經(jīng)驗(yàn),希望能為讀者提供參考
    2025-02-02
  • java swing 實(shí)現(xiàn)加載自定義的字體

    java swing 實(shí)現(xiàn)加載自定義的字體

    這篇文章主要介紹了java swing 實(shí)現(xiàn)加載自定義的字體,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • spring中自動(dòng)注入注解的實(shí)現(xiàn)方式

    spring中自動(dòng)注入注解的實(shí)現(xiàn)方式

    在Spring框架中,AutowiredAnnotationBeanPostProcessor負(fù)責(zé)處理@Autowired和@Value注解,實(shí)現(xiàn)依賴注入,首先通過TypeMappedAnnotations獲取注解,并根據(jù)注解屬性構(gòu)建InjectionMetadata,存入緩存
    2024-09-09
  • 基于java HashMap插入重復(fù)Key值問題

    基于java HashMap插入重復(fù)Key值問題

    這篇文章主要介紹了基于java HashMap插入重復(fù)Key值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解Java中$符的各種使用場(chǎng)景

    詳解Java中$符的各種使用場(chǎng)景

    在Java編程中,我們會(huì)經(jīng)常看到$符的身影,比如經(jīng)常在配置文件中看到$符號(hào)作為變量占位符,用于在運(yùn)行時(shí)動(dòng)態(tài)地獲取變量值。本文將詳細(xì)介紹$符號(hào)在Java編程中的各種應(yīng)用場(chǎng)景,以幫助您更好地理解和運(yùn)用這個(gè)符號(hào),感興趣的小伙伴可以收藏一下
    2023-04-04
  • SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • maven中添加memcached.jar的配置步驟

    maven中添加memcached.jar的配置步驟

    在Java項(xiàng)目中使用Maven管理依賴時(shí),如果需要添加??memcached.jar??依賴,可以通過本文介紹的步驟進(jìn)行配置,文章通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • Spring中bean標(biāo)簽的用法詳解

    Spring中bean標(biāo)簽的用法詳解

    Bean標(biāo)簽一般用于配置對(duì)象交由Spring?來創(chuàng)建,這篇文章主要來和大家詳細(xì)聊聊Spring中bean標(biāo)簽的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • Spring?Data?JPA?注解Entity關(guān)聯(lián)關(guān)系使用詳解

    Spring?Data?JPA?注解Entity關(guān)聯(lián)關(guān)系使用詳解

    這篇文章主要為大家介紹了Spring?Data?JPA?注解Entity關(guān)聯(lián)關(guān)系使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

含山县| 曲靖市| 本溪市| 高青县| 墨江| 合作市| 德令哈市| 双江| 武川县| 通辽市| 冀州市| 德令哈市| 星子县| 隆尧县| 买车| 清远市| 哈密市| 手游| 县级市| 尉犁县| 那坡县| 闽清县| 宝鸡市| 曲沃县| 广元市| 方山县| 五大连池市| 土默特左旗| 汽车| 惠水县| 武清区| 祁门县| 武冈市| 安仁县| 兰州市| 通渭县| 永春县| 余江县| 凭祥市| 买车| 青海省|