文件复制——多线程

[size=medium]多线程文件复制的实现与单线程实现的比较
[b]多线程文件复制[/b]
多线程进行文件的复制,利用字节流进行操作
假设将文件划分为几个部分

[b]写一个主类Main[/b],得到文件,写一个线程对每部分的文件同时进行复制
定义一个int类型的num 标记每个部分(方便对文件各部分进行复制)
写一个for循环,
for (int i = 0; i < 4; i++) {(分为四部分)
FileCopy fc = new FileCopy(i, f);
fc.start();
list.add(fc);
}
启动每个部分的线程,并加入list队列中

[b]写一个文件复制类[/b] 让这个类继承Thread,重写父类的run方法
创建一个arrayList队列对文件各部分进行管理
static ArrayList<FileCopy> list = new ArrayList<FileCopy>();
……
构造方法传入参数(文件f,标记数 )

在run方法中 获得读取文件流,
利用标记各部分的num,读取相应部分的文件内容

(需要注意,文件划分时,最后一部分的长度会大于或等于前面的)

读取中间的部分时,可利用skip方法,跳过前面的对要操作部分进行读取
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);

if (num < 3) {
// 定义数组来存放读取的数据
bs = new byte[(int) f.length() / 4];
} else {
int size = (int) (f.length() - f.length() / 4 * 3);
bs = new byte[size];
}

// 跳过多少子节
bis.skip(f.length() / 4 * num);

bis.read(bs);

在文件复制类中,定义一个复制是否完成的标记 isOk 为false,每次完成后
将false改为true


[b]写一个监视线程类[/b],用于判断复制是否完成,也继承Thread类,对文件复制类进行监视
( ListenerThread lis = new ListenerThread(); list.start(); )

判断文件复制是否完成

同样的在监视线程,为了控制线程的继续或结束
在while循环中 使用一个Boolean 型的标记 isOver = false 当文件复制完成,
isOver 的值变为true,结束线程


最后写出文件,
for (FileCopy fc : Main.list) {
byte[] bs = fc.bs;
bos.write(bs);
}
关闭流
[b]
判断文件复制是否完成
方法一[/b]

可以创建一个hashset队列,用于判断读取是否完毕
HashSet<Boolean> listBool = new HashSet<Boolean>();
每部分读取完成后,即为true

// 遍历,判断是否完毕
// for(FileCopy fc:FileTest.list){
// boolean b = fc.isOk;
// blist.add(b);
// }
//
// if(blist.size()==1){
//
// Boolean b = (Boolean)blist.toArray()[0];
// if(b){
// isOver = true;
// }
// }
// blist.clear();

[b] 判断 方法二[/b]

//定义一个boolean类型的变量a
while(!isOver){
// boolean a = true;
// for(FileCopy fc:FileTest.list){
// if(!fc.isOk){
// a = false;
// break;
// }
// }
//
// if(a){//a为true,则代表复制完成
// isOver = true;
// }
……


(当文件过大时,可以讲字节流包装成缓冲流,可以大大提高效率)


[b]单线程文件复制[/b](单线程文件复制效率没有多线程高,比较简单)
//输入流,读取文件
FileInputStream fis = new FileInputStream("D:\\FileInputStreamText.java");
//字节输出流,写入文件
FileOutputStream fos = new FileOutputStream("D:/File.java");
int i = fis.read();
while(i != -1){
num++;
fos.write(i);
}
fos.close();
fis.close();
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值