综合应用题:多线程复制文件(知识点:多线程、随机读写流)
生活随笔
收集整理的這篇文章主要介紹了
综合应用题:多线程复制文件(知识点:多线程、随机读写流)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要求:使用多線程復制一個文件(使用多線程復制一個文件可以加快文件的復制速度)
代碼:
package 多線程復制文件;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) {//這里我們使用4個線程同時復制一個文件---復制一個視頻// 先獲取文件的長度 length()File file = new File("D:\\線程.wmv");long l = file.length();//平均每段長度:長度/4 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;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"啟動了");// 根據位置賦值文件 RandomAccessFile read = null;RandomAccessFile write = null;try {read = new RandomAccessFile(new File("D:\\線程.wmv"), "rw");write = new RandomAccessFile(new File("D:\\線程2.wmv"), "rw");// 2 設置讀寫位置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){read.read(bs, 0, length-readLength);// 不夠1024的時候單獨讀一次write.write(bs, 0, length-readLength);break;}else{// 剩余需要讀的內容 大于等于1024read.read(bs);write.write(bs, 0, 1024);readLength+=1024;}}System.out.println(Thread.currentThread().getName()+"復制完畢");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(read!=null){try {read.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(write!=null){try {write.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }總結
以上是生活随笔為你收集整理的综合应用题:多线程复制文件(知识点:多线程、随机读写流)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java IO流之随机读写流Random
- 下一篇: 全面剖析【二叉树】的各类遍历方法