Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼
一、題目描述
題目實(shí)現(xiàn):網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳功能。
二、解題思路
獲取要下載的資源網(wǎng)址
顯示網(wǎng)絡(luò)資源的大小
上次讀取到的字節(jié)位置以及未讀取的字節(jié)數(shù)
輸入下載的起始位置和結(jié)束位置,開(kāi)始下載網(wǎng)絡(luò)資源
如果沒(méi)有下載完成,可以接著上次的下載位置繼續(xù)下載
創(chuàng)建一個(gè)類(lèi):BreakPointSuperveneFrame,繼承JFrame窗體類(lèi)。
定義一個(gè)download()方法:用于實(shí)現(xiàn)網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳。
核心重點(diǎn):通過(guò)設(shè)置請(qǐng)求參數(shù)RANGE實(shí)現(xiàn),通過(guò)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)容下載到客戶(hù)機(jī);如果將該參數(shù)設(shè)置為“RANGE:bytes=1024-”,就表示將網(wǎng)絡(luò)資源中從1024到結(jié)束位置的內(nèi)容全部下載到客戶(hù)機(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();// 斷開(kāi)連接 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ò)資源的地址并回車(chē),可以獲得網(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, "沒(méi)有網(wǎng)絡(luò)資源。\n\n請(qǐng)輸入正確的網(wǎng)址,然后回車(chē)。"); 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)的開(kāi)始位置 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("開(kāi)始下載"); } 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);// 寫(xiě)入磁盤(pán) len = in.read(buff);// 讀取內(nèi)容 } out.close();// 關(guān)閉流 in.close();// 關(guān)閉流 connection.disconnect();// 斷開(kāi)連接 if (readToPos > 0 && readToPos == totalLength) { JOptionPane.showMessageDialog(null, "完成網(wǎng)絡(luò)資源的下載。\n單擊“確定”按鈕退出程序。"); System.exit(0); } } catch (Exception e) { e.printStackTrace(); } } }
點(diǎn)擊開(kāi)始下載,提示要--》輸入地址后回車(chē)
輸入地址后回車(chē),會(huì)獲取文件的大小
嘗試先下載 0-1024 ,下載后,會(huì)自動(dòng)計(jì)算未下載的起始和結(jié)束位置。
下載后,寫(xiě)入本地文件,文件存儲(chǔ)在D:盤(pán)目錄下
下載成功提示:
文件存儲(chǔ)在D:盤(pán)目錄下
到此這篇關(guān)于Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼的文章就介紹到這了,更多相關(guān)Java斷點(diǎn)續(xù)傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC過(guò)濾器-登錄過(guò)濾的代碼實(shí)現(xiàn)
本篇文章主要介紹了Spring MVC過(guò)濾器-登錄過(guò)濾,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2017-01-01200行java代碼實(shí)現(xiàn)2048小游戲
這篇文章主要為大家詳細(xì)介紹了200行java代碼實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04簡(jiǎn)單實(shí)現(xiàn)Java web服務(wù)器
這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單實(shí)現(xiàn)Java web服務(wù)器的詳細(xì)步驟,感興趣的小伙伴們可以參考一下2016-06-06Quarkus篇入門(mén)創(chuàng)建項(xiàng)目搭建debug環(huán)境
這篇文章主要為大家介紹了Quarkus篇入門(mén)創(chuàng)建項(xiàng)目搭建debug環(huán)境,先來(lái)一套hello?world,來(lái)搭建基本的運(yùn)行及調(diào)試環(huán)境吧2022-02-02macOS中搭建Java8開(kāi)發(fā)環(huán)境(基于Intel?x86?64-bit)
這篇文章主要介紹了macOS中搭建Java8開(kāi)發(fā)環(huán)境(基于Intel?x86?64-bit)?的相關(guān)資料,需要的朋友可以參考下2022-12-12教你通過(guò)B+Tree平衡多叉樹(shù)理解InnoDB引擎的聚集和非聚集索引
大家都知道B+Tree是從二叉樹(shù)演化而來(lái),在這之前我們來(lái)先了解二叉樹(shù)、平衡二叉樹(shù)、平衡多叉樹(shù),這篇文章主要介紹了通過(guò)B+Tree平衡多叉樹(shù)理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下2022-01-01IDEA錯(cuò)誤:找不到或無(wú)法加載主類(lèi)的完美解決方法
使用IDEA開(kāi)始就一直在搭建java環(huán)境,許久沒(méi)有使用過(guò)java,剛開(kāi)始有些生疏,先建了一個(gè)最簡(jiǎn)單的類(lèi)可是運(yùn)行的時(shí)候出現(xiàn)錯(cuò)誤:找不到或無(wú)法加載主類(lèi),下面這篇文章主要給大家介紹了關(guān)于IDEA錯(cuò)誤:找不到或無(wú)法加載主類(lèi)的完美解決方法,需要的朋友可以參考下2022-07-07