利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优。因线程的个数可根据文件的大小及需求而定。其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理。以下是实现代码及自己理解的注释,多有偏差请见谅。
程序实现类代码:
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
//定义一个CopyThread类继承Thread类
public class CopyThread extends Thread{
private String srcPath;//原文件地址
private String destPath;//目标文件地址
private int start, end;//start指定起始位置,end指定结束位置
//构造CopyThread方法
public CopyThread(String srcPath, 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 = new RandomAccessFile(srcPath, "r");
//创建一个可读可写的随机访问文件
RandomAccessFile out = new RandomAccessFile(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 void main(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 = new CopyThread(srcPath, destPath, oneNum * i,oneNum * (i + 1));
ct.start();
}
//文件长度不能整除的部分放到最后一段处理
CopyThread ct = new CopyThread(srcPath, destPath, oneNum * (count-1),(int)len);
ct.start();
}
}
相关推荐
据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 资源管理器集成 通常我们都使用资源管理器来进行文件剪切,复制和粘贴的操作。如果安装了...
├—使用多线程读/写/校验,重叠IO,直接IO,从而实现设备最高读写性能。 ├—可以使用 UNIX通配符 样式的 包含/排除 筛选器。 ├—运行速度快,不占资源,因为仅使用 Win32 API 和 C 运行时设计,没有使用 MFC。 ...
RichCopy是一个Microsoft内部交流的一个文件复制工具。...据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 官方下载安装后打包的纯绿色版。
据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 资源管理器集成 通常我们都使用资源管理器来进行文件剪切,复制和粘贴的操作。如果安装了RichCopy ...
swoole重新定义PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务,下面的实例就可以证实这一功能。 一般来说,Swoole提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池...
拷优mini U盘自动复制工具软件是拷优...2、优化了文件复制性能,进一步提升运行稳定性; 3、优化软件对USB存储设备的识别性能,增强了对移动硬盘与存储卡等设备的兼容识别能力! 拷优mini U盘自动复制工具截图:
1、从库上面启动一个I/O线程,(5.5以后多线程)连接到主服务器上面请求读取二进制(Bin-log)日志文件 2、把读取到的二进制日志写到本地的Realy-log(中继日志)里面 3、从服务器上面同时开启一个SQL线程,读取...
FileSeek 使用多线程技术来提高搜索速度,使其能够胜任任何 Windows 搜索。在没有后台搜索索引的情况下,FileSeek 在关闭时不会影响计算机的性能。 搜索配置文件 搜索配置文件通过将搜索条件保存为搜索配置文件来...
不和其它开关一起使用,'ch' 命令仅复制压缩文件数据而不修改它。 例如: 设置压缩文件时间为最新的文件: rar ch -tl files.rar cw 写压缩文件注释到指定文件。 输出文件格式依赖于 -sc 开关。 如果...
《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...
FastCopy应用于Windows 平台,它是一款文件快速复制软件,别看它的体积小巧,但在文件复制速度上却是非常快的,要比WIN系统中自带的复制功能快上很多。FastCopy支持通过拖曳方式进行操作,支持拖曳多个文件到来源中...
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
FileSeek 使用多线程技术提高搜索速度,使其可执行任何 Windows 搜索。在没有后台搜索索引的情况下,FileSeek 在关闭时不会影响计算机的性能。 注意:初次运行后,首先必须先关闭软件的“自动检查更新”,依次点击...
多线程并发传输 IP地址过滤和屏蔽 基于用户权限验证的传输安全管理 支持后缀、文件名、正则表达式等多种发送文件过滤方式 支持平铺、复制、模板定义等多种远程文件组织方式 网络因逻辑错误、网络...
多线程处理网络IO:Redis 6.0开始引入多线程来处理网络IO操作,这样可以提高网络请求的处理速度,尤其是在高吞吐量的场景下。 客户端缓存:引入了服务端协助的客户端缓存功能,也称为Tracking功能。这项功能允许...
一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多...
advanced pdf password recovery是一款能够有效访问加密PDF文件...除此之外,软件还能够删除编辑、打印和复制PDF文件的限制,软件的多线程低级代码针对现代多核PC进行了优化,始终确保其最佳性能和最快的密码恢复速度。
在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的最小单位,线程是程序执行的最小单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多...