zoukankan      html  css  js  c++  java
  • javase多线程复制

     1 package multiThread;
     2 
     3 import java.io.File;
     4 import java.io.FileNotFoundException;
     5 import java.io.RandomAccessFile;
     6 
     7 import org.junit.Test;
     8 
     9 public class MultiThreadCopy {
    10     public void copy(String srcFile, String destFile) {
    11         File sf = new File(srcFile);
    12         // 源文件大小
    13         int length = (int) sf.length();
    14         // 线程数
    15         int count = 3;
    16         // 每个线程复制的大小
    17         int blockSize = length / count;
    18         for (int i = 0; i < count; i++) {
    19             int startPos = i * blockSize;
    20             int endPos = 0;
    21             if (i != (count - 1)) {
    22                 endPos = (i + 1) * blockSize - 1;
    23             } else {
    24                 endPos = length - 1;
    25             }
    26             // 开线程
    27             new ThreadCopy(srcFile, destFile, startPos, endPos).start();
    28         }
    29     }
    30 
    31     /**
    32      * 复制线程
    33      */
    34     class ThreadCopy extends Thread {
    35         private String srcFile;
    36         private String destFile;
    37         private int startPos;
    38         private int endPos;
    39 
    40         public ThreadCopy(String srcFile, String destFile, int startPos, int endPos) {
    41             super();
    42             this.srcFile = srcFile;
    43             this.destFile = destFile;
    44             this.startPos = startPos;
    45             this.endPos = endPos;
    46         }
    47 
    48         public void run() {
    49             try {
    50                 // 源文件
    51                 RandomAccessFile srcRaf = new RandomAccessFile(srcFile, "r");
    52                 // 目标文件
    53                 RandomAccessFile destRaf = new RandomAccessFile(destFile, "rw");
    54                 // 定位读存位置
    55                 srcRaf.seek(startPos);
    56                 destRaf.seek(startPos);
    57                 // 读取的字节数
    58                 int bytes = endPos - startPos + 1;
    59                 byte[] buf = new byte[1024];
    60                 int len = 0;
    61                 // 读取次数
    62                 int count = bytes / buf.length;
    63                 for (int i = 0; i < count; i++) {
    64                     // 最后一次读取
    65                     if (i == (count - 1)) {
    66                         if ((bytes % buf.length) != 0) {
    67                             buf = new byte[buf.length + (bytes % buf.length)];
    68                             srcRaf.read(buf);
    69                             destRaf.write(buf);
    70                         } else {
    71                             srcRaf.read(buf);
    72                             destRaf.write(buf);
    73                         }
    74                         srcRaf.close();
    75                         destRaf.close();
    76 
    77                     } else {
    78                         srcRaf.read(buf);
    79                         destRaf.write(buf);
    80                     }
    81                 }
    82 
    83             } catch (Exception e) {
    84                 e.printStackTrace();
    85             }
    86         }
    87     }
    88     @Test
    89     public static void main(String[] args){
    90         MultiThreadCopy mt = new MultiThreadCopy();
    91         String src="E:\大数据资料\文件\java基础\视频\day09\day01_01集合的复习.avi";
    92         String des="E:\day01_01集合的复习.avi";
    93         mt.copy(src, des);
    94     }
    95 }
  • 相关阅读:
    thinkphp的钩子的两种配置和两种调用方法
    php闭包实现函数的自调用,也是递归
    php的spl_autoload_register函数的一点个人见解
    详解js变量、作用域及内存
    关于js的call()和apply()两个函数的一点个人看法
    php实现斐波那契数列以及由此引起的联想
    php猴子称王或者约瑟夫难题
    Linux Bash Shell 快速入门
    Fedora14下首次搭建Samba服务器遇到的一些问题
    【JavaScript】我的JavaScript技术总结第一篇——编程细节
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6752036.html
Copyright © 2011-2022 走看看