Java-->多線程斷點續傳

来源:http://www.cnblogs.com/xmcx1995/archive/2016/08/19/5788704.html
-Advertisement-
Play Games

--> 在多線程複製的基礎上加入斷點續傳的功能 -->Test 測試類 --> MyThread 線程實現類 ...


--> 在多線程複製的基礎上加入斷點續傳的功能

-->Test 測試類

 1 package com.dragon.java.multithreaddownload;
 2 
 3 import java.io.File;
 4 
 5 /*
 6  * 多線程斷點續傳(下載)
 7  */
 8 public class Test {
 9     public static void main(String[] args) {
10         // @SuppressWarnings("resource")
11         // Scanner scanner = new Scanner(System.in);
12         // System.out.println("請輸入文件路徑:");
13                 // 直接寫死文件和線程數..
14         File srcFile = new File("F:/mp4/01_Java.mp4");
15         // System.out.println("請輸入線程數:");
16         // int n = scanner.nextInt();
17         int n = 4;
18         if (!srcFile.exists()) {
19             System.out.println("該文件不存在!");
20         }
21 
22         File desFile = new File(srcFile.getParent(), "new" + srcFile.getName());
23 
24                 // 單線程複製長度
25         long partLenghth = srcFile.length() / n + 1;
26         for (int i = 1; i < n + 1; i++) {
27                         // 啟動線程
28             new MyThread(srcFile, desFile, partLenghth * (i - 1), partLenghth
29                     * i).start();
30 
31         }
32     }
33 }

--> MyThread 線程實現類

 1 package com.dragon.java.multithreaddownload;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.io.RandomAccessFile;
 6 
 7 public class MyThread extends Thread {
 8     private File srcFile;
 9     private File desFile;
10     private long start;
11     private long end;
12 
13     MyThread() {
14         super();
15     }
16 
17     MyThread(File srcFile, File desFile, long start, long end) {
18         super();
19         this.srcFile = srcFile;
20         this.desFile = desFile;
21         this.start = start;
22         this.end = end;
23     }
24 
25     @Override
26     public void run() {
27                 // 創建配置文件存儲中斷時的文件指針
28         File configFile = new File(desFile.getParent(), Thread.currentThread()
29                 .getId() + ".config");
30         if (!configFile.exists() && desFile.exists()) {
31         
32 System.out.println(Thread.currentThread().getName() + "已經完成了下載");
33             return;
34         }
35                 // 將流寫在try() 中可以不需手動關閉流
36         try (RandomAccessFile rafSrc = new RandomAccessFile(srcFile, "r");
37                 RandomAccessFile rafDes = new RandomAccessFile(desFile, "rw");
38                 RandomAccessFile rafConfig = new RandomAccessFile(configFile,
39                         "rw");) {
40 
41             rafConfig.setLength(8);
42 
43                         // 當不是第一次下載時,將配置文件中的指針傳遞給開始指針
44             long pointer = rafConfig.readLong();
45             if (pointer != 0) {
46                 start = pointer;
47             }
48             rafSrc.seek(start);
49             rafDes.seek(start);
50 
51 // 顯示完成度 System.out.println(Thread.currentThread().getName() + "已下載:"
52                     + ((float) pointer / srcFile.length()) * 100 + "%");
53 
54             int len = -1;
55             byte[] buffer = new byte[32];
56             while ((len = rafSrc.read(buffer)) != -1) {
57                 rafDes.write(buffer, 0, len);
58                 pointer = rafSrc.getFilePointer();
59                 rafConfig.seek(0);
60                 rafConfig.writeLong(pointer);
61                                 // 當每個線程完成任務時結束線程
62                 if (rafSrc.getFilePointer() >= end) {
63                     break;
64                 }
65             }
66         } catch (IOException e) {
67             System.out.println(e);
68         }
69                 // 刪除配置文件
70         configFile.delete();
71     }
72 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先來看一段簡單的代碼: 輸出結果為: 由此可見,定義:在Eat(冒號函數)內部有一個參數self,在Sleep(點函數)內部沒有參數self;調用:用冒號(:)調用函數時,會預設傳一個值(調用者自身)作為第一個參數;用點(.)調用函數時,則沒有; -- 如果要使結果一致,則: 輸出結果: -- 我們 ...
  • DBCP連接池簡介 1、資料庫連接基礎 資料庫連接池基礎主要包括以下三個方面的內容:資料庫連接池的基本概念、資料庫連接池的工作原理、Java開源的連接池。下麵將從這三個方面一一介紹: (1)資料庫連接池的基本概念 資料庫連接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的Web應用程式中體現得尤為 ...
  • 這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 抽象 一種專門用來做父類,被繼承的. (模板) 格式: abstract class 抽象類名{ 屬性; 普通方法; 訪問許可權 abstract 返回值類型 ...
  • 在 Python 的Lib目錄里有一個:this.Py (或者在互動式解釋器中輸入import this) 它其實是隱藏的一首詩 ...
  • 題目是說給出一個數字,然後以1到這個數為序號當做二叉樹的結點,問總共有幾種組成二叉樹的方式。這個題就是用卡特蘭數算出個數,然後因為有編號,不同的編號對應不同的方式,所以結果是卡特蘭數乘這個數的階乘種方案。因為數字比較大,所以要用高精度的方法也就是用字元數組來做,我分別寫了三個函數,一個算加法,一個算 ...
  • 傳送門:hdu 5862 Counting Intersections 題意:對於平行於坐標軸的n條線段,求兩兩相交的線段對有多少個,包括十,T型 官方題解:由於數據限制,只有豎向與橫向的線段才會產生交點,所以先對橫向線段按x端點排序,每次加入一個線段,將其對應的y坐標位置+1,當出現一個豎向線段時 ...
  • django提供了一套用戶驗證系統,但是要使用這個系統,必須要使用django內置的用戶模型:django.contrib.auth.models.User,這個模型中預先定義了一些欄位,其中只有username和password是必須的。 username 用戶名,該欄位是必須的,長度限製版本之間 ...
  • Hashtable Hashtable 的實例有兩個參數影響其性能:初始容量 和載入因數。容量 是哈希表中桶 的數量,初始容量就是哈希表創建時的容量。註意,哈希表的狀態為 open:在發生“哈希衝突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜索。載入因數 是對哈希表在其容量自動增加之前可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...