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 }
时间: 2024-08-29 02:52:59

javase多线程复制的相关文章

mysql主从复制--mysql-5.6基于GTID及多线程复制

GTID,Global Transaction Identifiers,全局事务标识符     由服务器的UUID和事务ID号组成一个唯一的标识.mysql 5.6后,事务首部会记录server UUID,追踪十分简单. UUID,Universally Unique Identifier,全局唯一标识符. A为master,B.C为slave,当A宕机时,B将成为New Master.C需将自己有的事务而B没有的事务复制给B,然后B才能成为Master. B和C双方事务的协商过程,由于GTID

MySQL5.7的AB复制以及 GTID多线程复制 配置

mysql AB复制: 三台主机:MASTER IP:172.25.35.21 SLAVE1 IP:172.25.35.22 SLAVE2 IP:172.25.35.19 MYSQL版本:mysql5.7 下载安装包 mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm my

JavaSE:多线程总结(Thread)

今天来进行JavaSE多线程的总结: 先从几个概念说起: 程序:是一组指令的集合,一段静态的代码. 进程:每一个运行的程序,都会对应一个进程. 线程:一个进程中包含一个或多个线程,如果包含多个线程,那么这个程 序就是支持多线程的. 多线程的优点: ①提高了计算机对CPU的利用率. ②提高了程序的响应速度 线程的创建,运行 线程的创建: ①继承Thread类:必须重写run()方法 ②实现Runnable接口:必须实现run()方法 通常将run()的主体称为线程体 线程的启动: 通过start(

MySQL\MariaDB 多线程复制初探

背景: MariaDB 在10.0.0.5就已经支持了并发复制的功能,即从库多线程复制的功能.MySQL最先在5.6.3中支持.目前暂时没有用MySQL5.6的版本,故暂时只对MariaDB进行一些说明,后期会对MySQL进行说明. 对于replication很多同学都已经很熟悉了,这里稍微讲下,在复制过程中有3个线程:Master上的IO线程和Slave上的IO.SQL线程,复制的原理可以自己去google搜.从库一直都是异步复制主库的,通过SHOW SLAVE STATUS 可以查看从库落后

关系型数据库之MariDB 10.0.10多主一从的架构及多线程复制架构

一.MySQL 5.6 以后出现的GTID:GTID概念: 1.GTID是一个由服务器的UUID和事务序号组成的唯一事务序号      例如: UUID:N          1122-3322-1122:1           1122-3322-1122:2 2.GTID会被当做唯每一个事务的首部,将会自动生成并存到二进制日志中3.GTID可以用来追踪主从之间的事务传输.4.GTID主要应用于HA的功能.在多主模型中,标示某一个事务是来源于哪个特定的主服务器.5.从服务器不会修改或者添加新的

MySQL并发复制系列二:多线程复制 2016

并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/MariaDB主备复制基本原理: 主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点 master节点的Binlog dump线程,当slave节点与master正常连接的时候,master把更新的binlog 内容推送到sl

jAVA基础 提高文件复制性能之多线程复制文件

利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优.因线程的个数可根据文件的大小及需求而定.其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理.以下是实现代码及自己理解的注释,多有偏差请见谅.下面是兄弟连java培训总结的一些代码:供参考. 程序实现类代码: import java.io.Ra

mysql复制原理/基于库的多线程复制原理/基于BLGC的多线程复制原理

单线程主从复制: 从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql, 主要由以下三个线程完成. dump thread: 在主库上,发送binlog io thread: 在slave上,接收,转存,请求binlog sql thread :在slave 上,重做binlog 基于库的多线程复制原理: 从库向主库请求binlog,并将binlog转存到自己的relaylog中,从库重做binlog里面的sql, 主要由以下三个线程完成.

mysql5.6 基于GTID及多线程复制详解

一 GTID 详解 官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id MySQL 5.6 中,每一个 GTID 代表一个数据库事务.在上面的定义中,source_id 表示执行事务的主库 uuid(server_uuid),transaction_id 是一个从 1 开始的自增计数,表示在这个主库