多執行緒複製一個檔案
阿新 • • 發佈:2018-12-11
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(); } } }