输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹,要求使用多线程来操作。
时间: 2024-03-09 20:51:43 浏览: 75
好的,您可以使用Java中的多线程来实现这个功能。具体的实现步骤如下:
1. 首先创建File对象,分别表示A文件夹和B文件夹。
2. 然后创建一个线程池,利用多线程并发拷贝文件。
3. 遍历A文件夹中的所有文件和子文件夹,如果是文件夹,则创建相应的文件夹,否则就使用线程池把文件复制到B文件夹中。
以下是示例代码:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileCopyDemo {
public static void main(String[] args) {
String sourceFolder = "A"; // A文件夹名称
String targetFolder = "B"; // B文件夹名称
File src = new File(sourceFolder);
File dest = new File(targetFolder);
if (!src.exists()) {
System.out.println("源文件夹不存在!");
return;
}
if (!src.isDirectory()) {
System.out.println("源文件夹不是一个文件夹!");
return;
}
if (!dest.exists()) {
dest.mkdirs();
}
if (!dest.isDirectory()) {
System.out.println("目标文件夹不是一个文件夹!");
return;
}
ExecutorService threadPool = Executors.newFixedThreadPool(10); // 创建线程池
File[] files = src.listFiles();
for (File file : files) {
if (file.isDirectory()) {
File subFolder = new File(dest, file.getName());
if (!subFolder.exists()) {
subFolder.mkdirs();
}
threadPool.execute(new FolderCopyThread(file, subFolder, threadPool));
} else {
threadPool.execute(new FileCopyThread(file, new File(dest, file.getName())));
}
}
}
}
class FileCopyThread implements Runnable {
private final File src;
private final File dest;
public FileCopyThread(File src, File dest) {
this.src = src;
this.dest = dest;
}
@Override
public void run() {
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class FolderCopyThread implements Runnable {
private final File src;
private final File dest;
private final ExecutorService threadPool;
public FolderCopyThread(File src, File dest, ExecutorService threadPool) {
this.src = src;
this.dest = dest;
this.threadPool = threadPool;
}
@Override
public void run() {
File[] files = src.listFiles();
for (File file : files) {
if (file.isDirectory()) {
File subFolder = new File(dest, file.getName());
if (!subFolder.exists()) {
subFolder.mkdirs();
}
threadPool.execute(new FolderCopyThread(file, subFolder, threadPool));
} else {
threadPool.execute(new FileCopyThread(file, new File(dest, file.getName())));
}
}
}
}
```
注意:在实际使用中,您需要根据自己的具体需求,对示例代码进行修改。同时,为了避免误操作,建议您在使用前备份好A和B文件夹中的数据。
阅读全文