程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java-->實現斷點續傳(下載),java--斷點續傳

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

編輯:JAVA綜合教程

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


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

--> 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();
        }
    }
}

--> 通過復制來模擬簡單的斷點續傳...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved