package com.wjd.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
/*
*5.输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作
*A文件夹下面1、2、3、4、5
*先人为的把需要拷贝的文件分成几份(开几条线程就分几份)
*设计一个带同步锁的方法,获取一份文件
*/
//一个文件夹一个线程,弊端就是遇到文件特别多的时候效率会降低
public class Test5 {
public static void main(String[] args) {
ArrayList<File> list = new ArrayList<>();
File f = new File("E:\\wjd\\A");//需要复制的文件夹路径
File[] files = f.listFiles();//列出文件夹
for (int i = 0; i < files.length; i++) {
list.add(files[i]);
}
CopeFile copeFile = new CopeFile(list);
RemoveFile removeFile = new RemoveFile(copeFile);
int n = list.size();
for(int i = 0; i < n ; i++){//有几个文件创建几个线程
new Thread(removeFile).start();
}
System.out.println("复制完成!");
}
}
class CopeFile{
ArrayList<File> list;//把文件存储在ArrayList集合中
public CopeFile(ArrayList<File> list) {
super();
this.list = list;
}
public synchronized File copy() {//设置同步锁让每个线程获取不同的文件
if(list.get(0) != null){
return list.remove(0);//获得一个文件,则删除该元素,返回删除元素值,下一次再次访问第一个元素
}
return null;
}
}
class RemoveFile implements Runnable{
CopeFile copeFile;//创建CopeFile对象,内部成员变量list保存了子文件,对同一分对象进行操作
public RemoveFile(CopeFile copeFile) {
super();
this.copeFile = copeFile;
}
public void run() {
File file = copeFile.copy();
if(file == null){
Thread.currentThread().interrupt();//
}else{
try {
//使用IO流读入和输出文件
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\wjd\\B\\"+file.getName()));
String string=null;
while((string = bufferedReader.readLine()) != null){
bufferedWriter.write(string);
bufferedWriter.flush();
}
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}