生活随笔
收集整理的這篇文章主要介紹了
Java文件上传之断点续传解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文件上傳
斷點續傳的解決方案
- 流程
- 上傳前先把文件分塊
- 分塊上傳,中斷后重新上傳,已上傳的分塊則不用再上傳
- 各分塊上傳完成后合并文件
- 文件分塊的流程
- 獲取源文件的長度
- 根據設定的分塊文件大小計算出塊數
- 從源文件讀數據,依次向塊文件寫數據
public void test() throws IOException {File sourceFile
= new File("源文件絕對路徑");String chunkPath
= "放塊文件的路徑";long chunkSize
= 1024*1024;long chunkNum
= (long) Math.ceil(sourceFile
.length() * 1.0 / chunkSize
);RandomAccessFile rafRead
= new RandomAccessFile(sourceFile
,"r");byte[] bytes
= new byte[1024];for (int i
= 0; i
<chunkNum
; i
++) {File chunkFile
= new File(chunkPath
+i
);RandomAccessFile rafWrite
= new RandomAccessFile(chunkFile
,"rw");int len
= -1;while ((len
= rafRead
.read(bytes
)) != -1) {rafWrite
.write(bytes
,0,len
);if (chunkFile
.length() >= chunkSize
) {break ;}}rafWrite
.close();}rafRead
.close();}
- 文件的合并
- 利用RandomAccessFile類讀每一塊文件寫入一個新文件中
合并文件的代碼和文件分塊的代碼大同小異,這里就不寫了,如果需要的人多,可以留言,我再來更新
附1:淺析RandomAccessFile類
- RandomAccessFile類也是一個讀寫io流操作類,但它的優勢在于可以指定位置讀寫,得益于該類會有一個類似指針的光標(seek)來標記你當前需要讀取或者寫入的位置
- 最常用于上傳下載文件
public RandomAccessFile(File file
, String mode
)throws FileNotFoundException{String name
= (file
!= null ? file
.getPath() : null);int imode
= -1;if (mode
.equals("r"))imode
= O_RDONLY
;else if (mode
.startsWith("rw")) {imode
= O_RDWR
;rw
= true;if (mode
.length() > 2) {if (mode
.equals("rws"))imode
|= O_SYNC
;else if (mode
.equals("rwd"))imode
|= O_DSYNC
;elseimode
= -1;}}...}
public void seek(long pos
); public native long length(); public int read(byte b
[]); public int read(byte b
[], int off
, int len
); ...更多的請查看詳細api
總結
以上是生活随笔為你收集整理的Java文件上传之断点续传解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。