--> 斷點續傳: 就像迅雷下載文件一樣,停止下載或關閉程序,下次下載時是從上次下載的地方開始繼續進行,而不是重頭開始...
--> 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();
}
}
}
--> 通過復制來模擬簡單的斷點續傳...