`
Sunflower-13
  • 浏览: 72856 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

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

阅读更多

        利用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();
 }
}

 

6
0
分享到:
评论
7 楼 Sunflower-13 2016-08-27  
elena_me 写道
elena_me 写道
不错,运行程序,拷贝600M的文件,用了0.4毫秒

我错了,测的不是线程执行时间,重新测试了一下,10秒左右  

6 楼 Sunflower-13 2016-08-27  
tieye 写道
Sunflower-13 写道
tieye 写道
好文章 顶起

过奖了

加油

谢谢你   
5 楼 elena_me 2016-08-26  
elena_me 写道
不错,运行程序,拷贝600M的文件,用了0.4毫秒

我错了,测的不是线程执行时间,重新测试了一下,10秒左右  
4 楼 elena_me 2016-08-26  
不错,运行程序,拷贝600M的文件,用了0.4毫秒
3 楼 tieye 2016-08-26  
Sunflower-13 写道
tieye 写道
好文章 顶起

过奖了

加油
2 楼 Sunflower-13 2016-08-25  
tieye 写道
好文章 顶起

过奖了
1 楼 tieye 2016-08-25  
好文章 顶起

相关推荐

    微软多线程文件复制工具RichCopy 4

    据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 资源管理器集成 通常我们都使用资源管理器来进行文件剪切,复制和粘贴的操作。如果安装了...

    文件快速复制工具FastCopy.rar

    ├—使用多线程读/写/校验,重叠IO,直接IO,从而实现设备最高读写性能。 ├—可以使用 UNIX通配符 样式的 包含/排除 筛选器。 ├—运行速度快,不占资源,因为仅使用 Win32 API 和 C 运行时设计,没有使用 MFC。 ...

    Rich Copy 4

    RichCopy是一个Microsoft内部交流的一个文件复制工具。...据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 官方下载安装后打包的纯绿色版。

    RichCopy 3.5.050

    据用户反馈,在本地到本地,本地到远程,远程到远程的文件复制过程中,RichCopy可以比XCOPY最大提高10倍的性能。 资源管理器集成 通常我们都使用资源管理器来进行文件剪切,复制和粘贴的操作。如果安装了RichCopy ...

    php异步多线程swoole用法实例

    swoole重新定义PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务,下面的实例就可以证实这一功能。 一般来说,Swoole提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池...

    拷优mini U盘自动复制工具 v3.7.500.116.zip

    拷优mini U盘自动复制工具软件是拷优...2、优化了文件复制性能,进一步提升运行稳定性; 3、优化软件对USB存储设备的识别性能,增强了对移动硬盘与存储卡等设备的兼容识别能力! 拷优mini U盘自动复制工具截图:

    linux数据库主从复制

    1、从库上面启动一个I/O线程,(5.5以后多线程)连接到主服务器上面请求读取二进制(Bin-log)日志文件 2、把读取到的二进制日志写到本地的Realy-log(中继日志)里面 3、从服务器上面同时开启一个SQL线程,读取...

    闪电快速文件搜索工具 FileSeek Pro 6.3 中文多语免费版.zip

    FileSeek 使用多线程技术来提高搜索速度,使其能够胜任任何 Windows 搜索。在没有后台搜索索引的情况下,FileSeek 在关闭时不会影响计算机的性能。 搜索配置文件 搜索配置文件通过将搜索条件保存为搜索配置文件来...

    rar压缩软件.rar

    不和其它开关一起使用,'ch' 命令仅复制压缩文件数据而不修改它。 例如: 设置压缩文件时间为最新的文件: rar ch -tl files.rar cw 写压缩文件注释到指定文件。 输出文件格式依赖于 -sc 开关。 如果...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    FastCopy 3.2.1高速复制软件中文免费版.rar

    FastCopy应用于Windows 平台,它是一款文件快速复制软件,别看它的体积小巧,但在文件复制速度上却是非常快的,要比WIN系统中自带的复制功能快上很多。FastCopy支持通过拖曳方式进行操作,支持拖曳多个文件到来源中...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    文件搜索工具(FileSeek)6一款简单易用包含高级功能的文件搜索工具.rar

    FileSeek 使用多线程技术提高搜索速度,使其可执行任何 Windows 搜索。在没有后台搜索索引的情况下,FileSeek 在关闭时不会影响计算机的性能。 注意:初次运行后,首先必须先关闭软件的“自动检查更新”,依次点击...

    蚂蚁快传AntM3.1.0.13 使用手册

     多线程并发传输  IP地址过滤和屏蔽  基于用户权限验证的传输安全管理  支持后缀、文件名、正则表达式等多种发送文件过滤方式  支持平铺、复制、模板定义等多种远程文件组织方式  网络因逻辑错误、网络...

    Redis 6新时代的高性能数据存储.docx

    多线程处理网络IO:Redis 6.0开始引入多线程来处理网络IO操作,这样可以提高网络请求的处理速度,尤其是在高吞吐量的场景下。 客户端缓存:引入了服务端协助的客户端缓存功能,也称为Tracking功能。这项功能允许...

    Linux操作系统下kernel使用问题详细讲解

    一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多...

    Advanced_PDF_Password_Recovery 5.00.zip

    advanced pdf password recovery是一款能够有效访问加密PDF文件...除此之外,软件还能够删除编辑、打印和复制PDF文件的限制,软件的多线程低级代码针对现代多核PC进行了优化,始终确保其最佳性能和最快的密码恢复速度。

    嵌入式系统/ARM技术中的线程解析(一)

     在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的最小单位,线程是程序执行的最小单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多...

Global site tag (gtag.js) - Google Analytics