多线程复制文件Java_【Java】【多线程】【Java多线程复制文件】

本文介绍了一种通过Java实现的文件分块并行复制方法。该方法将一个大文件分成多个部分,并为每个部分创建独立的线程进行并行复制,显著提高了文件复制效率。文章提供了完整的代码示例,包括`CopyFile`类和`Test`类,展示了如何初始化复制任务和启动线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package mastercn;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.RandomAccessFile;

public class CopyFile implements Runnable {

//来源文件

private String sourceFileName;

//目标文件

private String targetFileName;

//分块总数

private int blockCount;

//开始COPY的块序号

private int blockNo;

//缓存大小

private int maxBuffSize=1024*1024;

/**

* 将sourceFileName文件分blockCount块后的第blockNo块复制至sourceFileName

* @param sourceFileName 来源文件全名

* @param targetFileName 目标文件全名

* @param blockCount 文件分块COPY数

* @param blockNo 开始COPY的块序号

*/

public CopyFile(String sourceFileName,String targetFileName,int blockCount,int blockNo)

{

this.sourceFileName=sourceFileName;

this.targetFileName=targetFileName;

this.blockCount=blockCount;

this.blockNo=blockNo;

}

public void run() {

//得到来源文件

File file=new File(sourceFileName);

//得到来源文件的大小

long size=file.length();

//根据文件大小及分块总数算出单个块的大小

long blockLenth=size/blockCount;

//算出当前开始COPY的位置

long startPosition=blockLenth*blockNo;

//实例化缓存

byte[] buff=new byte[maxBuffSize];

try{

//从源文件得到输入流

InputStream inputStream=new FileInputStream(sourceFileName);

//得到目标文件的随机访问对象

RandomAccessFile raf=new RandomAccessFile(targetFileName,"rw");

//将目标文件的指针偏移至开始位置

raf.seek(startPosition);

//当前读取的字节数

int curRedLength;

//累计读取字节数的和

int totalRedLength=0;

//将来源文件的指针偏移至开始位置

inputStream.skip(startPosition);

//依次分块读取文件

while((curRedLength=inputStream.read(buff))>0 && totalRedLength

{

//将缓存中的字节写入文件?目标文件中

raf.write(buff, 0, curRedLength);

//累计读取的字节数

totalRedLength+=curRedLength;

}

//关闭相关资源

raf.close();

inputStream.close();

}catch(Exception ex)

{

ex.printStackTrace();

}

}

}

package mastercn;

public class Test {

/**

* @param args

*/

//来源文件

private static String sourceFile;

//目标文件

private static String targetFile;

//分块数

private static int blockCount;

public static void main(String[] args) {

// TODO Auto-generated method stub

//

sourceFile=args[0];

targetFile=args[1];

blockCount=Integer.parseInt(args[2]);

//记录开始时间

long beginTime=System.currentTimeMillis();

//依次分块进行文件COPY

for(int i=0;i

{

//实例化文件复制对象

CopyFile copyFile=new CopyFile(sourceFile,targetFile,blockCount,i);

//实例化线程

Thread thread=new Thread(copyFile);

//开始线程

thread.start();

try

{

//加入线程

thread.join();

}

catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

//计算耗时

long endTime=System.currentTimeMillis();

//输出耗时

System.out.println("共用时:"+(endTime-beginTime)+"ms");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值