Java實現(xiàn)斷點續(xù)傳功能的示例代碼
一、題目描述
題目實現(xiàn):網(wǎng)絡(luò)資源的斷點續(xù)傳功能。
二、解題思路
獲取要下載的資源網(wǎng)址
顯示網(wǎng)絡(luò)資源的大小
上次讀取到的字節(jié)位置以及未讀取的字節(jié)數(shù)
輸入下載的起始位置和結(jié)束位置,開始下載網(wǎng)絡(luò)資源
如果沒有下載完成,可以接著上次的下載位置繼續(xù)下載
創(chuàng)建一個類:BreakPointSuperveneFrame,繼承JFrame窗體類。
定義一個download()方法:用于實現(xiàn)網(wǎng)絡(luò)資源的斷點續(xù)傳。
核心重點:通過設(shè)置請求參數(shù)RANGE實現(xiàn),通過RANGE參數(shù)可以指定下載網(wǎng)絡(luò)的字節(jié)區(qū)間,從而可以實現(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ī)。
測試下載這個鏈接
三、代碼詳解
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 = "";// 用于存儲網(wǎng)絡(luò)資源的地址
private long totalLength = 0;// 存儲網(wǎng)絡(luò)資源的大小,以字節(jié)為單位
private long readToPos = 0;// 存儲上次讀取到的位置
private long residuaryLength = 0;// 存儲未讀內(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ò)資源的斷點續(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();// 獲得連接對象
connection.connect();// 連接網(wǎng)絡(luò)資源
totalLength = connection.getContentLength();// 獲得網(wǎng)絡(luò)資源的長度
connection.disconnect();// 斷開連接
tf_totalLength.setText(String.valueOf(totalLength));// 顯示總長度
tf_readToPos.setText("0");// 顯示上次讀取到的位置
residuaryLength = totalLength;// 未讀內(nèi)容為文件總長度
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("個字節(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請輸入正確的網(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è)置下一個讀取點的開始位置
tf_endPos.setText(String.valueOf(totalLength));// 設(shè)置下一個讀取點的結(jié)束位置
tf_endPos.requestFocus();// 使結(jié)束位置文本框獲得焦點
tf_endPos.selectAll();// 選擇結(jié)束位置文本框中的全部內(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();// 獲得連接對象
connection.setRequestProperty("User-Agent", "NetFox");// 設(shè)置請求屬性
String rangeProperty = "bytes=" + startPosition + "-";// 定義請求范圍屬性
if (endPosition > 0) {
rangeProperty += endPosition;// 調(diào)整請求范圍屬性
}
connection.setRequestProperty("RANGE", rangeProperty);// 設(shè)置請求范圍屬性
connection.connect();// 連接網(wǎng)絡(luò)資源
InputStream in = connection.getInputStream();// 獲得輸入流對象
String file = url.getFile();// 獲得文件對象
String name = file.substring(file.lastIndexOf('/') + 1);// 獲得文件名
FileOutputStream out = new FileOutputStream("d:/" + name, true);// 創(chuàng)建輸出流對象,保存下載的資源
byte[] buff = new byte[2048];// 創(chuàng)建字節(jié)數(shù)組
int len = 0;// 定義存儲讀取內(nèi)容長度的變量
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();
}
}
}
點擊開始下載,提示要--》輸入地址后回車

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

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

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

下載成功提示:

文件存儲在D:盤目錄下

到此這篇關(guān)于Java實現(xiàn)斷點續(xù)傳功能的示例代碼的文章就介紹到這了,更多相關(guān)Java斷點續(xù)傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Quarkus篇入門創(chuàng)建項目搭建debug環(huán)境
這篇文章主要為大家介紹了Quarkus篇入門創(chuàng)建項目搭建debug環(huán)境,先來一套hello?world,來搭建基本的運(yùn)行及調(diào)試環(huán)境吧2022-02-02
macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)
這篇文章主要介紹了macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)?的相關(guān)資料,需要的朋友可以參考下2022-12-12
教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引
大家都知道B+Tree是從二叉樹演化而來,在這之前我們來先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下2022-01-01

