利用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基础 提高文件复制性能之多线程复制文件的更多相关文章

  1. Java基础 FileInputStream/ FileOutputStream / 字节输入流 字节输出流实现文件的复制

    FileInputStream/FileOutputStream的笔记: /**(FileInputStream/FileOutputStream四个步骤: ①声明②加载地址③read/write④c ...

  2. Java 基础(四)| IO 流之使用文件流的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景 ...

  3. Java基础知识笔记(五:多线程的同步问题)

    编写多线程程序往往是为了提高资源的利用率,或者提高程序的运行效率,或者更好地监控程序的运行过程等.多线程同步处理的目的是为了让多个线程协调地并发工作.对多线程进行同步处理可以通过同步方法和同步语句块实 ...

  4. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

  5. java基础第十六篇之多线程

    1:线程的概念 进程(任务):一个正在运行的程序 进程的调度:CPU来决定什么时候该运行哪个进程 (时间片轮流法) 线程在一个应用程序中,同时,有多个不同的执行路径,是进程中的实际运作单位. 好处是提 ...

  6. Java基础之序列化对象——将对象写入到文件中(SerializeObjects)

    控制台程序. 首先定义一个含有任意不同数据类型域的可序列化类: import java.io.Serializable; public class Junk implements Serializab ...

  7. JAVA多线程读写文件范例

    在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入 ...

  8. MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)

    MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves) http://www.tuicool.com/articles/m2Unmeq 姜承饶 简称MTS:基于binlog ...

  9. 黑马程序员——java基础之文件复制

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流!---------------------- <a href="http:// ...

随机推荐

  1. appium常见问题01_android筛选下拉框无法定位问题

    近期用appium做android自动化的过程中,遇到一种筛选下拉框,神奇的是,定位工具定位怎样都定位不到. 首先尝试用uiaotomator工具定位,无法定位到下拉框元素,只能定位到底层元素: 询问 ...

  2. 解析jmeter阶梯加压与请求的计算

    用百度做例子 我们设置阶梯加压线程组的请求参数,如下图 上图表示 1:每隔2秒钟,会在1秒内启动5个线程 2:每次线程加载之后都会运行2s然后开始下一次线程加载 3:最终会加载50个线程并持续运行30 ...

  3. tensorflow学习笔记六----------神经网络

    使用mnist数据集进行神经网络的构建 import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from ...

  4. wordpress开发的一些积累

    wordpress 攒知识点 记录开发 wordpress 的一些技能点,以备不时之需 短代码 Shortcode 虽然很多插件都是提供,直接在代码中插入类似[Shortcode] 便可以生效,但是很 ...

  5. C#操作电脑多显示器设置

    电脑多显示器设置 第一种方式 通过使用api函数SetDisplayConfig来设置.这种方式在某些电脑中设置有几率会导致电脑黑屏 使用代码如下: private const uint SDC_AP ...

  6. Laravel 学习笔记之数据库操作——Eloquent ORM

    1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...

  7. webpack output的path publicPath

    path是用来定义入口文件保存的地址,而publicPath是定义非入口文件需要抽离保存的第三方文件的保存地址 vue-cli 中HtmlWebpackPlugin生成html,都会存在path路径上 ...

  8. __bridge

    Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举 ...

  9. 基于linux(CentOS7)数据库性能优化(Postgresql)

    基于CentOS7数据库性能优化(Postgresql) 1.  磁盘 a)         Barriers IO i.              通过查看linux是否加载libata,确定是否开 ...

  10. 解决vuex数据页面刷新后初始化问题

    在vue项目的开发中经常会用到vuex来进行数据的存储,然而在开发过程中会出现刷新后页面的vuex的state数据初始化问题!下面是我用过的解决方法 利用storage缓存来实现vuex数据的刷新问题 ...