日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RandomAccessFile并发复制文件

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 錯誤。

實現代碼

文件復制線程

  • 首先要先實現一個文件復制的線程,可以根據源文件路徑,目標文件路徑,復制文件大小,從文件哪個地方開始復制,代碼如下:
/*** 文件復制線程* @author Administrator**/class CopyFileThread implements Runnable{// 源文件路徑private String souceFile;// 目標文件路徑private String targetFile;// 復制文件長度private Long copyLength;// seek指定文件位置private Long seekIndex;public CopyFileThread(String souceFile, String targetFile, long copyLength , long seekIndex) {this.souceFile = souceFile;this.targetFile = targetFile;this.copyLength = copyLength;this.seekIndex = seekIndex;}@Overridepublic void run() {// 設置讀寫文件緩沖區,減少文件讀寫對磁盤的訪問次數,提高性能byte [] buffer = new byte[1024];try ( RandomAccessFile souce = new RandomAccessFile(souceFile, "rw") ;RandomAccessFile target = new RandomAccessFile(targetFile, "rw") ;) {// 計算需要讀取的文件次數long readCount = copyLength / 1024;for (int i = 0; i < readCount; i++) {if (i != readCount -1 ) {// 不是最后一次時souce.read(buffer);target.write(buffer);} else {// 最后一次時,獲取剩余文件長度int tempBufferLength = 1024 + (int)(copyLength % 1024);byte[] tempBuffer = new byte[tempBufferLength];souce.read(tempBuffer);target.write(tempBuffer);}}} catch (Exception e) {e.printStackTrace();} }}

實現并發復制

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并发复制文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。