Java-->實現斷點續傳(下載)

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

--> 斷點續傳: 就像迅雷下載文件一樣,停止下載或關閉程式,下次下載時是從上次下載的地方開始繼續進行,而不是重頭開始... --> RandomAccessFile --> pointer(文件指針) --> seek(移動文件指針) --> 斷點續傳 --> 通過複製來模擬簡單的斷點續傳... ...


--> 斷點續傳: 就像迅雷下載文件一樣,停止下載或關閉程式,下次下載時是從上次下載的地方開始繼續進行,而不是重頭開始...

--> RandomAccessFile --> pointer(文件指針) --> seek(移動文件指針) --> 斷點續傳

package com.dragon.java.downloadfile;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/*
 斷點續傳:對下載軟體非常重要!
 --> 第一次下載 100 位元組
 --> 第二次下載 101 位元組...想辦法知道上次從哪個地方斷掉的。  上次已經下載到了什麼位置。  記下斷點的位置
 ------> 需要第三方的文件專門記住斷點的位置
 */
public class Test {
    public static void main(String args[]) {
        File srcFile = new File("D:/Java4Android/01_Java考古學/01_Java考古學.mp4");
        File desDir = new File("f:/vidio");
        copyFileToDir(srcFile, desDir);
    }

    public static void copyFileToDir(File srcFile, File desDir) {
        desDir.mkdirs();
        // 創建配置文件
        File configFile = new File(desDir, srcFile.getName().split("\\.")[0]
                + ".config");
        // 創建目標文件
        File desFile = new File(desDir, srcFile.getName());
        if (!configFile.exists() && desFile.exists()) {
            System.out.println("已下載過該文件!");
            return;
        }
        RandomAccessFile rafSrc = null;
        RandomAccessFile rafDes = null;
        RandomAccessFile rafConfig = null;
        try {
            rafSrc = new RandomAccessFile(srcFile, "r");
            rafDes = new RandomAccessFile(desFile, "rw");
            rafConfig = new RandomAccessFile(configFile, "rw");

            // 設置目標文件和源文件一樣長
            rafDes.setLength(srcFile.length());
            // 設置配置的文件長度為8,防止第一次下載是出現EOF 異常
            rafConfig.setLength(8);

            // 從上次下載的位置開始繼續下載!
            long pointer = rafConfig.readLong();
            System.out.println("已下載:" + ((float) pointer / srcFile.length())
                    * 100 + "%");
            rafSrc.seek(pointer);
            rafDes.seek(pointer);

            // 單次傳輸長度設置小點,好觀察是否斷點續傳
            byte[] buffer = new byte[32];
            int len = -1;
            // 每次複製的開始,必須把源文件的指針和目標文件的指針從上次斷開的位置去讀
            while ((len = rafSrc.read(buffer)) != -1) {
                rafDes.write(buffer, 0, len);
                // 在配置文件寫的時候,每次使文件指針移動到最初的位置 --> 這樣永遠對只會存儲前8個位元組
                rafConfig.seek(0);
                // 每複製一次之和,趕緊記錄下文件指針的位置,以備斷點續傳使用。
                rafConfig.writeLong(rafSrc.getFilePointer());
            }

        } catch (IOException e) {
            System.out.println(e);
        } finally {
            try {
                rafSrc.close();
                rafDes.close();
                rafConfig.close();
            } catch (IOException e) {
                System.out.println(e);
            }
            // 在流關閉之後刪除配置文件
            System.out.println("下載成功!");
            configFile.delete();
        }
    }
}

--> 通過複製來模擬簡單的斷點續傳...


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

-Advertisement-
Play Games
更多相關文章
  • 打算出去找工作了,聽說面試有很多優化的題目,於是上網一搜,順便整理一下: 1.對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: s ...
  • 1.簡介 在我們數據分析的實際應用中,我們可能會花費大量的時間在數據清洗上,而如果使用 R 裡面自帶的一些函數(base 包的 transform 等),可能會覺得力不從心,或者不是很人性化。好在我們有其他選擇。這裡我們介紹 dplyr 包。 首先載入包: 單表操作函數(one table verb ...
  • 1、PDO:PDO 簡介 PDO(PHP Data Object)即PHP數據對象,其為PHP訪問不同的資料庫定義了一致的介面。PDO只是抽象層面的介面,本身並不能提供訪問資料庫的能力,要想使用PDO訪問資料庫,需要為其指定一個實現了PDO介面的資料庫驅動。其類似於JAVA中的JDBC規範。 實現了 ...
  • 提交給ACM與IEEE的論文中(如CIKM),除了有明確具體字體類型的Type1和TrueType字體外,經常會出現Type3字體。 Type 3 字體是矢量外框字體,很多網站所稱Type 3是點陣字體其實是錯誤的。不同於 Type 1,PostScript Type 3 字體不支援 Hinting ...
  • 一、生成器 通過列表生成式,我們可以直接創建一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈 ...
  • 最近新寫的程式要做beta測試,在做綠色版(免安裝版)時遇到了問題,vs2015做的項目本以為像之前的vs版本一樣把msvcrXXX.dll還有另外幾個運行時庫都放到exe旁邊即可,然並卵。。。,在win7的測試機上還會提示找不到這個dll:api-ms-win-crt-runtime-l1-1-0 ...
  • 這篇博客總結了1天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 因為前不久偶然發現某網站直接複製粘貼我的博客,交談之後他們修改了出處. 封裝 一, 封裝的概念 1. 類可以看成一個封裝體,將對象的屬性和方法封裝到類中. 2 ...
  • 在開發過程當中需要用到配置信息,這些信息不能進行硬編碼,這時配置文件是一個比較好的方式,java提供了properties格式的文件,以鍵值對的方式保存信息,在讀取的時候通過鍵獲得鍵對應的值,spring提供了讀取properties文件的支持,下麵看具體的配置, 一、<context:proper ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...