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

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

  程序实现类代码:

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) {

"http://blog.51cto.com/viewpic.php?refimg=" + 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();

}

}

时间: 2024-08-09 06:34:40

jAVA基础 提高文件复制性能之多线程复制文件的相关文章

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

为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既然是流动也就会有方向,有入方向和出方向.举个上传文件的栗子,现在有三个对象,文件.应用程序.上传的目标地址(服务器).简化的上传文件有两步: 应用程序读文件

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

黑马程序员--Java基础学习笔记【序列化、多线程】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 序列化流与反序列化流 ObjectOutputStream 对象输出流 writeObject(Object obj) 可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中 ObjectInputStream对象输入流 readObject(Objectobj) 从源输入流中读取字节序列,反序列化为一个对象并返回 序列化:将数据分解成字节流,以便存储在文件中或在网络上传输

Java基础学习第二十五天——多线程学习总结(二)

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.03.31 lutianfei none JDK5中Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock. Lock: void lock(): 获取锁. void unlock():释放锁. ReentrantLock是Lock的实现类. public class SellT

No_16_0325 Java基础学习第二十四天—多线程学习总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.03.25 lutianfei none 第十章 多线程 多线程概述 什么是进程? 进程:就是正在运行的程序. 进程是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程有什么意义呢? 可以在一个时间段内执行多个任务. 可以提高CPU的使用率. 什么是线程呢? 在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程. 线程:是程序的执行单元,执行路径.是程序使用CPU的最

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

编写多线程程序往往是为了提高资源的利用率,或者提高程序的运行效率,或者更好地监控程序的运行过程等.多线程同步处理的目的是为了让多个线程协调地并发工作.对多线程进行同步处理可以通过同步方法和同步语句块实现.Java虚拟机是通过对资源(如内存)加锁的方式实现这两种同步方式.这种机制带来的另一个问题就是死锁问题(即程序的所有线程都处于阻塞态或等待态).良好的程序设计应当设法避开这种死锁问题. 一.多线程同步的基本原理 如果在多个并发线程之间共用资源,则可能就需要进行同步处理.Java虚拟机通过给每个对

java基础第十九天_QQ、多线程下载

1.QQ 2.屏广软件,大数据包处理,frame缓冲区最多保持两帧画面,1s内没有集齐所有frameunit,则丢弃. 3.从互联网多线程下载 地址 : http://apache.opencas.org/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz RandomAccessFile Thread (>= 3) HttpURLConnection.setRequestProperty("Range", "bytes=209

Java基础系列:(4)多线程的一些用法示例

一 Java中线程的实现 (1)通过继承Thread类 package javase.thread;class MyThread extends Thread{ public void run(){ for(int i=0;i<10;i++) System.out.println("正在运行线程:" + currentThread().getName()); }}public class ThreadDemo { public static void main(String[] 

java基础提高篇&mdash;&mdash;对象的创建

我一直使用构造器的方式生成或者初始化对象.最近发现一些对象在项目中并没有实际作用,有时我只是需要它的一些功能,为此新建一个对象是不是比较消耗资源,影响程序的性能呢.今天看到一些资料,对这个问题作出了一个回答. 说明: 首先肯定的是,我们有时候并不需要一个类的全部功能,或许我们需要的只是其中的一两个方法,没必要为此新建一个类.静态方法解决了这个问题.静态方法应该成为每个面向对象设计程序者必修课程.首先我们学习静态方法创建对象. 使用静态工厂的方式产生对象的好处有这样几个好处:"一:静态方法都有名字