1. 程式人生 > >多執行緒複製一個檔案

多執行緒複製一個檔案

package teacher;
/**  
* 描述:多執行緒複製檔案
*  
* @author ASUS  
* @date 2018年9月22日
*/

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test {
	public static void main(String[] args) { 
     
	File file = new File("C:\\Users\\ASUS\\Desktop\\我是java.txt");
	long l = file.length();
	
	int avgLength = (int)l/4;
	// 建立四個執行緒物件 傳遞 起始 和終止位置 
	//最後一段的結束位置:因為--長度/4--不一定能不除盡,可能有餘數,所以必須在最後一節將剩餘的都算上來 
	MyThead thead = new MyThead(0, avgLength-1);
	MyThead thead2 = new MyThead(avgLength, 2*avgLength-1);
	MyThead thead3 = new MyThead(avgLength*2, 3*avgLength-1);
	MyThead thead4 = new MyThead(3*avgLength, (int)file.length()-1);
	
	thead.start();
	thead2.start(); 
	thead3.start();
	thead4.start();
	}
} 
//子執行緒 
class MyThead extends Thread{ 
	int start;//起始位置
	int end;//終止為止
	public MyThead(int start,int end) {
		this.start = start;
		this.end = end;
		} 
	@Override 
	public void run() {
		System.out.println(Thread.currentThread().getName()+"啟動了"); 
		
		RandomAccessFile read = null;
		RandomAccessFile write = null; 
		try {
			read = new RandomAccessFile(new File("C:\\Users\\ASUS\\Desktop\\我是java.txt"), "rw");
			write = new RandomAccessFile(new File("C:\\Users\\ASUS\\Desktop\\我是c.txt"), "rw");
			
			read.seek(start); 
			write.seek(start);
			
			int length = end-start+1;
			
			int readLength = 0;//已經讀取的長度
			
			byte[] bs = new byte[1024];
			while(true){ 
				/*因為每段要複製的長度不一定恰好是1024的整數倍,夠1024時,直接讀寫即可;
				   不滿1024時,有多少就讀多少
				   因此這裡需要將剩餘檔案長度與1024進行比較
				   判斷剩餘位元組個數是否小於1024---1024為byte陣列中定義的長短 
				   如果不小 正常讀取1024 4097 
				   如果小於 只讀 剩餘的 總長度-讀取了的長度*
				 * 
				 */
				if(length-readLength<1024){// 不夠1024的時候單獨讀一次 
					read.read(bs, 0, length-readLength);//將正好 len-readLength 個位元組從此檔案讀入bs 陣列,並從當前檔案off開始。
				 
				    write.write(bs, 0, length-readLength); //將 len-readLength 個位元組從指定 bs 陣列寫入到此檔案,並從偏移量 off 處開始。
				break;
				}else{ // 剩餘需要讀的內容 大於等於1024
					write.write(bs, 0, 1024); 
					readLength+=1024;
					}
				} 
			System.out.println(Thread.currentThread().getName()+"複製完畢");
			read.close();
			write.close(); 
			} catch (FileNotFoundException e) { 
				// TODO Auto-generated catch block
				e.printStackTrace(); 
			}catch (IOException e) { 
					// TODO Auto-generated catch block 
					e.printStackTrace();
			}
		} 
	}