文件复制——多线程

[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 list = new ArrayList();
……
构造方法传入参数(文件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 listBool = new HashSet();
每部分读取完成后,即为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]

你可能感兴趣的:(java高级多线程)