问题描述:
输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。
解决方案:
package cn.jit;
//输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test12 implements Runnable {
public static void copyFile(File from,File to) throws IOException //复制文件
{
FileInputStream fis = new FileInputStream(from);
FileOutputStream fos = new FileOutputStream(to);
int tmp = 0;
byte[] b = new byte[100];
while((tmp = fis.read(b)) != -1)
{
fos.write(b,0, tmp);
}
fis.close();
fos.flush();
fos.close();
}
public static void copyDirectory(String from,String to) throws IOException //复制文件夹
{
File[] file = new File(from).listFiles();
new File(to).listFiles();
for(int i = 0;i < file.length;i++)
{
if (file[i].isFile()) {
File sourceFile = file[i];
File targetFile = new File(
new File(to).getAbsolutePath() + File.separator//File.separator 是系统默认的文件分隔符号
+ file[i].getName());
copyFile(sourceFile, targetFile);// 递归调用
}
if (file[i].isDirectory()) {
String dir1 = from + "/" + file[i].getName();
String dir2 = to + "/" + file[i].getName();
copyDirectory(dir1, dir2);
}
}
}
public static void main(String[] args) throws IOException {
Test12 t = new Test12();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
@Override
public void run() {
synchronized (this)
{
Scanner input = new Scanner(System.in);
System.out.println("请输入复制的文件夹:");
String fromFile = input.next();
System.out.println("请输入复制后的文件夹:");
String toFile = input.next();
File file1 = new File(fromFile);
File file2 = new File(toFile);
File[] filelist = file1.listFiles();//获取file1的文件或文件夹
for(int i = 0;i < filelist.length;i++)
{
if(filelist[i].isFile())
{
File tmp = new File(file2.getAbsolutePath() + File.separator + filelist[i].getName());
try {
copyFile(filelist[i], tmp);
} catch (IOException e) {
e.printStackTrace();
}
}
if(filelist[i].isDirectory())
{
String source = file1 + File.separator + filelist[i].getName();
String target = file2 + File.separator + filelist[i].getName();
try {
copyDirectory(source,target);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}