RandomAccessFile并发复制文件
RandomAccessFile概述
下面是引自jdk1.6的api中對這個類的描述:
此類的實例支持對隨機訪問文件的讀取和寫入。隨機訪問文件的行為類似存儲在文件系統中的一個大型 byte 數組。存在指向該隱含數組的光標或索引,稱為文件指針;輸入操作從文件指針開始讀取字節,并隨著對字節的讀取而前移此文件指針。如果隨機訪問文件以讀取/寫入模式創建,則輸出操作也可用;輸出操作從文件指針開始寫入字節,并隨著對字節的寫入而前移此文件指針。寫入隱含數組的當前末尾之后的輸出操作導致該數組擴展。該文件指針可以通過 getFilePointer 方法讀取,并通過 seek 方法設置。
通常,如果此類中的所有讀取例程在讀取所需數量的字節之前已到達文件末尾,則拋出 EOFException(是一種 IOException)。如果由于某些原因無法讀取任何字節,而不是在讀取所需數量的字節之前已到達文件末尾,則拋出 IOException,而不是 EOFException。需要特別指出的是,如果流已被關閉,則可能拋出 IOException。
代碼實現
- 要實現并發復制文件,主要通過RandomAccessFile類的seek方法實現,然后
seek方法描述:
public void seek(long pos)
throws IOException設置到此文件開頭測量到的文件指針偏移量,在該位置發生下一個讀取或寫入操作。偏移量的設置可能會超出文件末尾。偏移量的設置超出文件末尾不會改變文件的長度。只有在偏移量的設置超出文件末尾的情況下對文件進行寫入才會更改其長度。
參數:
pos - 從文件開頭以字節為單位測量的偏移量位置,在該位置設置文件指針。
拋出:
IOException - 如果 pos 小于 0 或者發生 I/O 錯誤。
實現代碼
文件復制線程
- 首先要先實現一個文件復制的線程,可以根據源文件路徑,目標文件路徑,復制文件大小,從文件哪個地方開始復制,代碼如下:
實現并發復制
package io.file;import java.io.RandomAccessFile ;public class CopyFileByRand {// 定義每個線程復制的文件塊大小private final int BLOCK = 1024 * 1024 * 64;/*** 多線程復制文件* @param souceFile 源文件存放路徑* @param targetFile 復制文件存放路徑*/public void currentCopyFile(String souceFile, String targetFile){// jdk7新寫法,try()表示最終try塊執行完畢之后,()中的資源會被釋放,等同于在finally塊中釋放資源try ( RandomAccessFile source = new RandomAccessFile(souceFile, "rw");RandomAccessFile target = new RandomAccessFile(targetFile, "rw");) {// 獲取文件長度 long fileLength = source.length();// 獲取需要幾個線程進行讀取,最后一個線程讀取剩余的long count = fileLength / BLOCK;for (int i = 0; i < count; i++) {// 設置目標文件長度target.setLength(fileLength);// "rw" 表示文件可讀可寫source.seek(i * BLOCK);target.seek(i * BLOCK);// 判斷是否是最后一次if (i == count -1) {// 最后一次時,復制文件長度=文件塊大小+最后一小塊因為fileLength / BLOCK丟失的小數部分文件塊大小long copyFileLength = BLOCK + fileLength % BLOCK;// 不是最后一次,文件長度就等于文件塊長度new Thread( new CopyFileThread(souceFile, targetFile, copyFileLength, i * BLOCK)).start();} else{// 不是最后一次,文件長度就等于文件塊長度new Thread( new CopyFileThread(souceFile, targetFile, BLOCK, i * BLOCK)).start();}}} catch (Exception e) {e.printStackTrace();}}public static void main(String [] args) {CopyFileByRand copy = new CopyFileByRand();copy.currentCopyFile("G:/迅雷下載/變形金剛5.mp4", "E:/變形金剛5.mp4");} }總結
以上是生活随笔為你收集整理的RandomAccessFile并发复制文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【附源码】Java计算机毕业设计民宿客栈
- 下一篇: 2020女生适合学什么设计