多线程复制 java_java 多线程拷贝copy 复制

多线程拷贝程序主要有四个类组成:WorkThread类,ReadFrom类,WriteTo类,ExpressCopy类

WorkTread类:主要负责文件拷贝的线程类

ReadFrom类:主要负责从源文件读取数据到缓冲区

WriteTo类:主要负责把缓冲区的数据写进新的文件

ExpressCopy类:类似于测试类,以上3个是核心代码

WorkThread类

package copy1;

import java.io.FileNotFoundException;

import java.io.IOException;

public class WorkThread extends Thread

{

private long begin,end;//文件块读取的起始和结束位置

private String sourceFile,desFile;

public WorkThread(long begin, long end, String sourceFile, String desFile)

{

this.begin=begin;

this.end=end;

this.sourceFile=sourceFile;

this.desFile=desFile;

}

public void run()

{

byte[] buffer=new byte[4096];//设置缓冲区

int len=0;

try

{

ReadFrom rf=new ReadFrom(this.sourceFile);

WriteTo wt=new WriteTo(this.desFile);

long startTime=System.currentTimeMillis();

while(begin

{

len=rf.read(buffer, begin);

//判断读取的数据是否超出了文件块的结束位置end

if(begin+len>end) len=(int)(end-begin);

wt.write(buffer, len, begin);

begin+=len;//起始位置往前移动len个字节

}

rf.close();

wt.close();

long endTime=System.currentTimeMillis();

System.out.println(endTime-startTime);

}catch(IOException e)

{

e.printStackTrace();

}

}

}

ReadFrom类

package copy1;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

public class ReadFrom

{

private RandomAccessFile from;

public ReadFrom(String fromFile) throws FileNotFoundException

{

this.from=new RandomAccessFile(fromFile, "r");

}

//同步文件读取操作

synchronized public int read(byte[] buffer, long pos) throws IOException

{

from.seek(pos);

return from.read(buffer);

}

//关闭随机文件访问流,释放相关系统资源

public void close() throws IOException

{

from.close();

}

}

WriteTo类

package copy1;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

public class WriteTo

{

private RandomAccessFile to;

public WriteTo(String toFile) throws FileNotFoundException

{

to=new RandomAccessFile(toFile,"rw");

}

//同步文件写入操作

synchronized public void write(byte[] buffer,int len, long pos) throws IOException

{

to.seek(pos);

to.write(buffer, 0, len);

}

//关闭随机文件访问流,释放相关系统资源

public void close() throws IOException

{

to.close();

}

}

ExpressCopy类

package copy1;

import java.io.File;

import java.io.IOException;

public class ExpressCopy

{

private String sourceFilePath;//源文件路径

private String desFilePath;//目标文件路径

public ExpressCopy()

{

//没用GUI,直接在源程序上初始化参数

this.sourceFilePath="";

this.desFilePath="";

}

public void work()

{

File f=new File(sourceFilePath);

//判断文件是否存在或是否为空文件

if(!f.exists()||f.length()==0)

{

System.out.println("The source file"+sourceFilePath+"does not exist or its length is 0");

}

long len=f.length();

try

{

Thread[] t=new Thread[2];

//用2个线程的原因是因为经本人测试,用2个线程时比单线程时快,但用3个线程的时候却比单个线程还慢

for(int i=0;i<2;i++)

{

t[i]=new WorkThread(i*len/2,(i+1)*len/2,sourceFilePath,desFilePath);

System.out.println("第"+i+"个线程已经启动");

t[i].start();

}

}catch(Exception e)

{

e.printStackTrace();

}

}

}

小弟是一个java初学者,如果文章中有什么不对的地方或兄台有更好的解决方案,还望不吝赐教,给我留言

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值