jAVA基础 提高文件复制性能之多线程复制文件
利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优。因线程的个数可根据文件的大小及需求而定。其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理。以下是实现代码及自己理解的注释,多有偏差请见谅。下面是兄弟连java培训
总结的一些代码:供参考。
程序实现类代码:
importjava.io.RandomAccessFile;
importjava.nio.channels.FileChannel;
importjava.nio.channels.FileLock;
//定义一个CopyThread类继承Thread类
public class CopyThreadextends Thread{
private String srcPath;//原文件地址
private String destPath;//目标文件地址
private int start,end;//start指定起始位置,end指定结束位置
//构造CopyThread方法
public CopyThread(StringsrcPath, String destPath, int start, int end) {
this.srcPath = srcPath;//要复制的源文件路径
this.destPath = destPath;//复制到的文件路径
this.start = start;//复制起始位置
this.end = end;//复制结束位置
}
//重写run()方法
public void run() {
try {
//创建一个只读的随机访问文件
RandomAccessFile in = newRandomAccessFile(srcPath, "r");
//创建一个可读可写的随机访问文件
RandomAccessFile out = newRandomAccessFile(destPath, "rw");
in.seek(start);// 将输入跳转到指定位置
out.seek(start);// 从指定位置开始写
FileChannel inChannel =in.getChannel(); //文件输入通道
FileChannel outChannel =out.getChannel();//文件输出通道
//锁住需要操作的区域,false代表锁住
FileLock lock = outChannel.lock(start,(end-start), false);
//将字节从此通道的文件传输到给定的可写入字节的outChannel通道。
inChannel.transferTo(start,(end-start), outChannel);
lock.release();//释放锁
out.close();//从里到外关闭文件
in.close();//关闭文件
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试类代码:
import java.io.File;
public class TestMain {
public static voidmain(String[] args) {
//要复制的源文件路径
String srcPath ="F:\\sun\\上课笔记\\aa.txt";
String destPath ="F:\\sun\\上课笔记\\aa复件.txt";
// 获得源文件长度
File f = new File(srcPath);
long len = f.length();
int count = 3;// 需要的线程数
int oneNum = (int) (len /count);//每个线程负责的文件长度,强制转换成int类型
//用for循环处理划分文件的第一部分跟第二部分(循环次数可根据定义的线程数调整)
for (int i = 0; i <count - 1; i++) {
//oneNum * i 起始位置, oneNum * (i + 1)要复制数据的长度
CopyThread ct = newCopyThread(srcPath, destPath, oneNum * i,oneNum * (i + 1));
ct.start();
}
//文件长度不能整除的部分放到最后一段处理
CopyThread ct = newCopyThread(srcPath, destPath, oneNum * (count-1),(int)len);
ct.start();
}
}
jAVA基础 提高文件复制性能之多线程复制文件的更多相关文章
- Java基础 FileInputStream/ FileOutputStream / 字节输入流 字节输出流实现文件的复制
FileInputStream/FileOutputStream的笔记: /**(FileInputStream/FileOutputStream四个步骤: ①声明②加载地址③read/write④c ...
- Java 基础(四)| IO 流之使用文件流的正确姿势
为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景 ...
- Java基础知识笔记(五:多线程的同步问题)
编写多线程程序往往是为了提高资源的利用率,或者提高程序的运行效率,或者更好地监控程序的运行过程等.多线程同步处理的目的是为了让多个线程协调地并发工作.对多线程进行同步处理可以通过同步方法和同步语句块实 ...
- Java基础知识笔记(四:多线程基础及生命周期)
一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...
- java基础第十六篇之多线程
1:线程的概念 进程(任务):一个正在运行的程序 进程的调度:CPU来决定什么时候该运行哪个进程 (时间片轮流法) 线程在一个应用程序中,同时,有多个不同的执行路径,是进程中的实际运作单位. 好处是提 ...
- Java基础之序列化对象——将对象写入到文件中(SerializeObjects)
控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...
- JAVA多线程读写文件范例
在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入 ...
- MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves) http://www.tuicool.com/articles/m2Unmeq 姜承饶 简称MTS:基于binlog ...
- 黑马程序员——java基础之文件复制
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流!---------------------- <a href="http:// ...
随机推荐
- nginx详解反向代理,负载均衡,LNMP架构上线动态网站
1.nginx介绍 nginx.org Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/ ...
- Dubbo分布式服务框架入门(附工程)
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...
- LeetCode算法题-Maximize Distance to Closest Person(Java实现)
这是悦乐书的第328次更新,第351篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第198题(顺位题号是849).在一排座位中,1表示一个人坐在该座位上,0表示座位是空的 ...
- LeetCode算法题-Magic Squares In Grid(Java实现)
这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...
- Java多线程学习——例子:模拟电影院抢座位
Cinema——List<Integer>数据结构存储电影院座位 public class Cinema{ private List<Integer> seats; //剩余座 ...
- 机器学习实战-K-近邻算法(kNN)
k-近邻算法(kNN)---它的工作原理是:存在一个样本数据集合,也称做训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每 ...
- docker安装tomcat&部署javaweb程序
一.docker定制简单的java-web应用镜像 网址: 1.jdk下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk ...
- STL 函数适配器(function adapter)
函数适配器(function adapter):通过不同函数适配器的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能. 绑定(bind) template <class ...
- JDK8中接口的新特性
在JDK8环境中,接口中的方法不再是只能有抽象方法,还可以有静态方法和default方法.实现类只需要实现它的抽象方法即可,JDK8中的接口有愈发向抽象类靠拢的感觉. 关于静态方法和默认方法作如下简述 ...
- 自动构建War包的Ant build.xml模板
<?xml version="1.0" encoding="UTF-8" ?> <project name="[*****]你的项目 ...