公共類別 FileCoper {
私有靜態最終字串_ORIGIN_FILE_MODE =“r”;
私有靜態最終字串_TARGET_FILE_MODE =“rw”;
私有靜態長時間1 = 0l;
私有字串originFileName;
私有字符串目標檔名;
私有RandomAccessFile originFile;
私有RandomAccessFile目標檔;
私有 int threadCount;
私有靜態 int 總線程數 = 0;
私人靜態 int 執行計數 = 0;
公共 FileCoper() {
this.threadCount = 1;
總執行緒數 = this.threadCount;
}
公共 FileCoper(字串 originFile, 字串 targetFile) {
嘗試 {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
總執行緒數 = this.threadCount;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
公共 FileCoper(字串 originFile,字串 targetFile,int threadCount){
嘗試 {
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
總執行緒數 = this.threadCount;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
公共無效初始化(字串originFile,字串targetFile)拋出異常{
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = 1;
總執行緒數 = this.threadCount;
}
公共無效初始化(字串originFile,字串targetFile,int threadCount)拋出異常{
this.originFileName = originFile;
this.targetFileName = targetFile;
this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE);
this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE);
this.threadCount = threadCount;
總執行緒數 = this.threadCount;
}
公共無效初始化(RandomAccessFile originFile,RandomAccessFile targetFile)拋出例外狀況{
this.originFile = originFile;
this.targetFile = targetFile;
this.threadCount = 1;
總執行緒數 = this.threadCount;
}
公共無效初始化(RandomAccessFile originFile,RandomAccessFile targetFile,int threadCount)拋出例外狀況{
this.originFile = originFile;
this.targetFile = targetFile;
this.threadCount = threadCount;
總執行緒數 = this.threadCount;
}
公共靜態同步無效完成(){
FileCoper.executedCount ++;
System.out.println("總執行緒【" + FileCoper.totalThreadCount + "】,已經完成【" + FileCoper.execulatedCount + "】個執行緒的複製!!!");
if (FileCoper.totalThreadCount == FileCoper.execulatedCount){
長時間2 = System.currentTimeMillis();
System.out.println("花費時間長:"+(time2-time1));
System.out.println("所有【" + FileCoper.totalThreadCount + "】執行緒複製完成!!!");
}
}
公共無效開始()拋出異常{
if (this.originFile.length() == 0)
返回;
if (this.threadCount == 0)
this.threadCount = 1;
// 設定目標檔案大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek(0);
this.originFile.seek(0);
time1 = System.currentTimeMillis();
System.out.println(this.originFile.length());
//放入檔案分塊,每一塊有一對值:目前區塊在檔案中的起始位置和結束位置
長[][] splits = new 長[this.threadCount][2];
長 originFileLength = this.originFile.length();
int 起始位置 = 0;
for (int i = 0; i < this.threadCount; i++) {
分割[i][0] = 0;
分割[i][1] = 0;
如果(我==0){
分割[i][0] = 0;
splits[i][1] = originFileLength / this.threadCount;
} else if (i == this.threadCount - 1) {
//注意:此處不能加1,如果加1,線程多文件就會出現亂碼
// splits[i][0] = startPos + 1;
splits[i][0] = startPos;
splits[i][1] = originFileLength;
} 別的 {
//注意:此處不能加1,如果加1,線程多文件就會出現亂碼
// splits[i][0] = startPos + 1;
splits[i][0] = startPos;
splits[i][1] = startPos + originFileLength / this.threadCount;
}
startPos += originFileLength / this.threadCount;
// System.out.println(splits[i][0] + " " + splits[i][1]);
Coper fc = new Coper("線程-" + i);
fc.init(this.originFile, this.targetFile, splits[i][0], splits[i][1]);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
fc.start();
}
}
公共無效startNew()拋出異常{
if (this.originFile.length() == 0)
返回;
// 設定目標檔案大小
this.targetFile.setLength(this.originFile.length());
this.targetFile.seek(0);
this.originFile.seek(0);
長起始位置;
長端位置;
長塊 = this.originFile.length() / 1029;
if(區塊 <= 1)
this.threadCount = 1;
for (int i = 0; i < this.threadCount; i++) {
// 定義每次改變的長度
startPosition = i * 1029 * (區塊/this.threadCount);
endPosition = (i + 1) * 1029 * (塊/this.threadCount);
if (i == (this.threadCount - 1))
endPosition = this.originFile.length();
Coper fc = new Coper("線程-" + i);
fc.init(this.originFile, this.targetFile, startPosition, endPosition);
fc.setOriginFileName(this.originFileName);
fc.setTargetFileName(this.targetFileName);
fc.start();
}
}
私有類別 Coper 擴展 Thread {
私有字串originFileName;
私有字符串目標檔名;
私有RandomAccessFile originFile;
私有RandomAccessFile目標檔;
私有字串線程ID;
私人長起始位置;
私人多頭頭寸;
私有長塊容量;
公共無效setOriginFileName(字串originFileName){
this.originFileName = originFileName;
}
公有無效setTargetFileName(字串目標檔名){
this.targetFileName = targetFileName;
}
公共銅(字串線程ID){
this.threadId = 線程Id;
}
公共無效初始化(RandomAccessFile originFile,RandomAccessFile targetFile,長startPosition,長endPosition)拋出異常{
this.originFile = originFile;
this.targetFile = targetFile;
this.startPosition = startPosition;
this.endPosition = endPosition;
this.blockCapacity = this.endPosition - this.startPosition;
}
公共無效運行(){
// System.out.println(this.threadId + " 啟動,開始複製檔案【" +
// this.originFileName + "】中的檔案區塊【" + this.startPosition + "," +
// this.endPosition + "】到目標檔案【" + this.targetFileName + "】中...");
同步(this.originFile){
嘗試 {
// 記錄目前拷貝的位元組數
int 複製計數 = 0;
// 資料拷貝的暗示偏移量
長offSet = this.startPosition;
位元組[] b = 新位元組[16 * 1024 * 1024];
// 動態設定一次讀取的位元組數緩衝
長塊大小=0;
while (copyCount < this.blockCapacity) {
this.originFile.seek(offSet);
if (this.blockCapacity - copyCount > 16 * 1024 * 1024)
塊大小 = 16 * 1024 * 1024;
別的
blockSize = this.blockCapacity - copyCount;
if (blockSize > this.blockCapacity - copyCount)
blockSize = this.blockCapacity - copyCount;
int count = this.originFile.read(b, 0, (int) blockSize);
同步(this.targetFile){
嘗試 {
if (副本數 == 0)
this.targetFile.seek(offSet);
別的
this.targetFile.seek(offSet + 1);
this.targetFile.write(b, 0, 計數);
} catch (IOException e) {
e.printStackTrace();
}
}
// 增加拷貝的位元組數
複製計數 += 計數;
// 複製其實【偏移下移
偏移量 += 計數;
}
} catch (IOException e) {
e.printStackTrace();
}
}
// System.out.println(this.threadId + " 複製檔案【" + this.originFileName
// + "】中的檔案區塊【" + this.startPosition + "," + this.endPosition +
// "】到達目標檔【" + this.targetFileName + "】完成!");
// 完成通知主線程,當前線程複製工作
FileCoper.finish();
}
}
公共靜態無效主(字串[] args)拋出異常{
FileCoper fc = new FileCoper();
fc.init("e:/InitialData_zhihuan.sql", "e:/InitialData_zhihuan2.sql", 30);
//fc.init("d:/ValueAdd_11.txt", "d:/ValueAdd_111.txt", 100);
// fc.init("D:/tools/music/做你的愛人.mp3", "d:/做你的愛人_5.mp3", 10);
//fc.init("E:/電影/最黑暗下部.rmvb", "d:/最黑暗下部_1.rmvb", 100);
/* // 讀入鍵盤輸入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 檔案來源
字串原始文件;
// 檔案目標
字串目標檔案;
System.out.println("【原始檔、目標檔、執行緒數】");
System.out.print("要複製的原始檔:");
originFile = br.readLine();
System.out.print("檔案複製到目標檔案:");
targetFile = br.readLine();
System.out.print("切分執行緒數:");
int threadCount = Integer.parseInt(br.readLine());
fc.init(originFile, targetFile, threadCount);*/
// fc.startNew();
長時間1 = System.currentTimeMillis();
fc.start();
長時間2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}