<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
題目實現:網路資源的斷點續傳功能。
獲取要下載的資源網址
顯示網路資源的大小
上次讀取到的位元組位置以及未讀取的位元組數
輸入下載的起始位置和結束位置,開始下載網路資源
如果沒有下載完成,可以接著上次的下載位置繼續下載
建立一個類: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; /** * Description: * * @author xiaoxuzhu * @version 1.0 * * <pre> * 修改記錄: * 修改後版本 修改人 修改日期 修改內容 * 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 = "";// 用於儲存網路資源的地址 private long totalLength = 0;// 儲存網路資源的大小,以位元組為單位 private long readToPos = 0;// 儲存上次讀取到的位置 private long residuaryLength = 0;// 儲存未讀內容的大小 /** * 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("下載網路資源的斷點續傳"); 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, "沒有網路資源。nn請輸入正確的網址,然後回車。"); 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斷點續傳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45