亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java多線程復制文件的實例代碼

2019-11-26 16:13:44
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:
 
package com.test; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.RandomAccessFile; 

public class FileCoper { 
    private static final String _ORIGIN_FILE_MODE = "r"; 

      
     private static final String _TARGET_FILE_MODE = "rw"; 

     private static long time1 = 0l; 
     private String originFileName; 

      
     private String targetFileName; 

      
     private RandomAccessFile originFile; 

      
     private RandomAccessFile targetFile; 

      
     private int threadCount; 

      
     private static int totalThreadCount = 0; 

     private static int executedCount = 0; 

     public FileCoper() { 
      this.threadCount = 1; 
      totalThreadCount = this.threadCount; 
     } 

     public FileCoper(String originFile, String targetFile) { 
      try { 
       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; 
       totalThreadCount = this.threadCount; 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

     public FileCoper(String originFile, String targetFile, int threadCount) { 
      try { 
       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; 
       totalThreadCount = this.threadCount; 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

      
     public void init(String originFile, String targetFile) throws Exception { 
      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; 
      totalThreadCount = this.threadCount; 
     } 

      
     public void init(String originFile, String targetFile, int threadCount) throws Exception { 
      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; 
      totalThreadCount = this.threadCount; 
     } 

      
     public void init(RandomAccessFile originFile, RandomAccessFile targetFile) throws Exception { 
      this.originFile = originFile; 
      this.targetFile = targetFile; 
      this.threadCount = 1; 
      totalThreadCount = this.threadCount; 
     } 

      
     public void init(RandomAccessFile originFile, RandomAccessFile targetFile, int threadCount) throws Exception { 
      this.originFile = originFile; 
      this.targetFile = targetFile; 
      this.threadCount = threadCount; 
      totalThreadCount = this.threadCount; 
     } 

      
     public static synchronized void finish() { 
      FileCoper.executedCount ++; 

      System.out.println("總線程【" + FileCoper.totalThreadCount + "】,已經完成【" + FileCoper.executedCount + "】個線程的復制?。?!"); 
      if (FileCoper.totalThreadCount == FileCoper.executedCount){ 
          long time2 = System.currentTimeMillis(); 
          System.out.println("花費時長:"+(time2-time1)); 
           System.out.println("所有【" + FileCoper.totalThreadCount + "】線程復制完成?。?!"); 
      } 
     } 

      
     public void start() throws Exception { 
      if (this.originFile.length() == 0) 
       return; 
      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()); 
      // 把文件分塊,每一塊有一對值:當前塊在文件中的起始位置和結束位置  
      long[][] splits = new long[this.threadCount][2]; 
      long originFileLength = this.originFile.length(); 
      int startPos = 0; 
      for (int i = 0; i < this.threadCount; i++) { 
       splits[i][0] = 0; 
       splits[i][1] = 0; 
       if (i == 0) { 
        splits[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; 
       } else { 
        // 注意:此處不能加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("thread-" + i); 
       fc.init(this.originFile, this.targetFile, splits[i][0], splits[i][1]); 
       fc.setOriginFileName(this.originFileName); 
       fc.setTargetFileName(this.targetFileName); 
       fc.start(); 
      } 
     } 

      
     public void startNew() throws Exception { 
      if (this.originFile.length() == 0) 
       return; 
      // 設置目標文件大小  
      this.targetFile.setLength(this.originFile.length()); 
      this.targetFile.seek(0); 
      this.originFile.seek(0); 

      long startPosition; 
      long endPosition; 
      long block = this.originFile.length() / 1029; 

      if (block <= 1) 
       this.threadCount = 1; 

      for (int i = 0; i < this.threadCount; i++) { 
       // 定義每次轉移的長度  
       startPosition = i * 1029 * (block / this.threadCount); 
       endPosition = (i + 1) * 1029 * (block / this.threadCount); 
       if (i == (this.threadCount - 1)) 
        endPosition = this.originFile.length(); 
       Coper fc = new Coper("thread-" + i); 
       fc.init(this.originFile, this.targetFile, startPosition, endPosition); 
       fc.setOriginFileName(this.originFileName); 
       fc.setTargetFileName(this.targetFileName); 
       fc.start(); 

      } 
     } 

     private class Coper extends Thread { 

       
      private String originFileName; 

       
      private String targetFileName; 

      private RandomAccessFile originFile; 

       
      private RandomAccessFile targetFile; 

       
      private String threadId; 

       
      private long startPosition; 

       
      private long endPosition; 

       
      private long blockCapacity; 

       
      public void setOriginFileName(String originFileName) { 
       this.originFileName = originFileName; 
      } 

       
      public void setTargetFileName(String targetFileName) { 
       this.targetFileName = targetFileName; 
      } 

      public Coper(String threadId) { 
       this.threadId = threadId; 
      } 

       
      public void init(RandomAccessFile originFile, RandomAccessFile targetFile, long startPosition, long endPosition) throws Exception { 
       this.originFile = originFile; 
       this.targetFile = targetFile; 
       this.startPosition = startPosition; 
       this.endPosition = endPosition; 
       this.blockCapacity = this.endPosition - this.startPosition; 
      } 

      public void run() { 
       // System.out.println(this.threadId + " 啟動,開始復制文件【" +  
       // this.originFileName + "】中的文件塊【" + this.startPosition + "," +  
       // this.endPosition + "】到目標文件【" + this.targetFileName + "】中...");  
       synchronized (this.originFile) { 
        try { 
         // 記錄當前拷貝的字節數  
         int copyCount = 0; 
         // 數據拷貝的啟示偏移量  
         long offSet = this.startPosition; 
         byte[] b = new byte[16 * 1024 * 1024]; 
         // 動態設置一次讀取的字節數緩沖  
         long blockSize = 0; 
         while (copyCount < this.blockCapacity) { 
          this.originFile.seek(offSet); 
          if (this.blockCapacity - copyCount > 16 * 1024 * 1024) 
           blockSize = 16 * 1024 * 1024; 
          else 
           blockSize = this.blockCapacity - copyCount; 
          if (blockSize > this.blockCapacity - copyCount) 
           blockSize = this.blockCapacity - copyCount; 
          int count = this.originFile.read(b, 0, (int) blockSize); 
          synchronized (this.targetFile) { 
           try { 
            if (copyCount == 0) 
             this.targetFile.seek(offSet); 
            else 
             this.targetFile.seek(offSet + 1); 

            this.targetFile.write(b, 0, count); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
          // 增加拷貝的字節數  
          copyCount += count; 
          // 拷貝其實【偏移量下移  
          offSet += count; 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       // System.out.println(this.threadId + " 復制文件【" + this.originFileName  
       // + "】中的文件塊【" + this.startPosition + "," + this.endPosition +  
       // "】到目標文件【" + this.targetFileName + "】完成!");  

       // 通知主線程,當前線程完成復制工作  
       FileCoper.finish(); 
      } 

     } 

     public static void main(String[] args) throws Exception { 
      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));
      // 文件來源
      String originFile;
      // 文件目標
      String targetFile;
      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();  
      long time1 = System.currentTimeMillis(); 
      fc.start(); 
      long time2 = System.currentTimeMillis(); 
      System.out.println(time2-time1); 
     } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97视频在线看| 成人黄色午夜影院| 亚洲精品丝袜日韩| 91麻豆国产语对白在线观看| 亚洲成人精品视频在线观看| 国产精品成人一区二区| 亚洲视频在线免费看| 亚洲精品美女免费| 欧美精品免费在线观看| 久久人人爽国产| 国产免费一区视频观看免费| 狠狠躁天天躁日日躁欧美| 国产精品91在线| xx视频.9999.com| 日韩精品视频在线| 91久久精品国产91久久| 久久色精品视频| 欧美日韩激情视频8区| 欧美日韩国产999| 中文字幕亚洲在线| 久久久免费电影| 在线国产精品播放| 97视频com| 成人黄色免费在线观看| 国产成人精品视频在线观看| 欧美一区深夜视频| 精品日本美女福利在线观看| 欧美成人精品一区二区| 8x海外华人永久免费日韩内陆视频| 91色视频在线导航| 亚洲天堂av图片| xxxxx成人.com| 国产精品一区专区欧美日韩| 久久精品国产69国产精品亚洲| 日韩成人高清在线| 久久久人成影片一区二区三区| 国产精品网红福利| 亚洲精品一区二区在线| 中文字幕亚洲国产| 国产精品久久中文| 欧美性xxxxxxx| www国产精品com| 国产91精品久| 亚洲国产精品久久精品怡红院| 欧美成人h版在线观看| 成人a视频在线观看| 欧美成人黑人xx视频免费观看| 久久国产视频网站| 中文字幕欧美亚洲| 日韩av影视在线| 日韩欧美在线视频观看| 亚洲精品之草原avav久久| 欧美中文在线免费| 亚洲白虎美女被爆操| 成人网在线免费看| 国产精品视频男人的天堂| 亚洲a级在线播放观看| 欧美日韩国产麻豆| 久久精品这里热有精品| 久久久日本电影| 韩剧1988在线观看免费完整版| 亚洲一区二区三区乱码aⅴ| 久久在线视频在线| 性欧美在线看片a免费观看| 亚洲人成网7777777国产| 一区二区在线免费视频| 精品久久久在线观看| 国产伊人精品在线| 亚洲欧美一区二区三区情侣bbw| 欧美激情成人在线视频| 日韩欧美精品网站| 欧美性精品220| 欧美人与性动交a欧美精品| 亚洲天堂色网站| 国产成人涩涩涩视频在线观看| 91在线无精精品一区二区| 国产亚洲精品久久久优势| 国产精品∨欧美精品v日韩精品| 亚洲伊人成综合成人网| 亚洲www视频| 国产精品福利观看| 国产精品久久久久999| 国产精品视频不卡| 国产精品嫩草影院久久久| 亚洲bt欧美bt日本bt| 国产精品91在线观看| 亚洲第一福利在线观看| 欧美成人免费一级人片100| 91精品国产综合久久久久久蜜臀| 国内成人精品一区| 亚洲色图激情小说| 国产成人精品一区| 欧美视频在线观看免费网址| 欧美精品做受xxx性少妇| 日韩有码在线视频| 26uuu亚洲伊人春色| 狠狠躁夜夜躁人人爽天天天天97| 日韩黄在线观看| 亚洲天堂精品在线| 欧美激情成人在线视频| 国产专区精品视频| 国产综合福利在线| 国产精品综合不卡av| 九九九热精品免费视频观看网站| 韩国日本不卡在线| 国产精品aaa| 91丨九色丨国产在线| 欧美一级电影在线| 国产精品夜间视频香蕉| 热99在线视频| 久久精品人人做人人爽| 精品偷拍一区二区三区在线看| 日韩精品日韩在线观看| 欧美理论片在线观看| 久久久国产精品视频| 欧美乱大交xxxxx另类电影| 亚洲最大av在线| 国产成人精品综合久久久| 亚洲欧美日韩视频一区| 日韩av网站导航| 亚洲xxx视频| 91精品国产九九九久久久亚洲| 日韩av快播网址| 日韩有码在线电影| 国产精品福利观看| 欧美激情免费视频| 98视频在线噜噜噜国产| 国产精品pans私拍| 中文字幕亚洲一区二区三区五十路| 亚洲黄色片网站| 亚洲午夜国产成人av电影男同| 欧美电影在线观看高清| 国产日韩欧美电影在线观看| 亚洲天堂精品在线| 国产91亚洲精品| 日韩久久午夜影院| 国产91在线播放九色快色| 8050国产精品久久久久久| 久久久久久国产精品久久| 欧美高清视频一区二区| 欧美壮男野外gaytube| 在线视频免费一区二区| 欧美日韩免费区域视频在线观看| 欧美一级片一区| 欧美性猛交xxxx黑人猛交| 精品国偷自产在线视频| 久久久久www| 亚洲综合一区二区不卡| 国产偷国产偷亚洲清高网站| 青草成人免费视频| 色综合视频一区中文字幕| 日韩一区视频在线| 国产精品第七影院| 国产精品第一视频| 亚洲乱码一区二区| 亚洲嫩模很污视频| 91美女高潮出水| 日韩在线高清视频| 亚洲黄色免费三级| 国产精品高潮粉嫩av| 色综合色综合久久综合频道88| 日韩经典一区二区三区| 国产精品私拍pans大尺度在线| 国产免费一区视频观看免费|