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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

综合应用题:多线程复制文件(知识点:多线程、随机读写流)

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 综合应用题:多线程复制文件(知识点:多线程、随机读写流) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要求:使用多線程復制一個文件(使用多線程復制一個文件可以加快文件的復制速度)

代碼:

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();}}}} }

總結

以上是生活随笔為你收集整理的综合应用题:多线程复制文件(知识点:多线程、随机读写流)的全部內容,希望文章能夠幫你解決所遇到的問題。

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