java:多线程拷贝指定文件夹下的文件(不考虑子文件夹,只考虑当层文件夹下的文件),单个线程拷贝单个文件。原文件夹名、目标文件名及线程数由用户输入。所有线程完成工作后,输出“文件夹内文件拷贝完成”的消息。
时间: 2024-10-14 07:11:33 浏览: 23
在Java中,你可以使用`java.util.concurrent.ExecutorService`和`java.io.File`类来实现这个功能。这里是一个简单的示例,展示了如何创建一个固定线程数的任务队列,每个线程负责复制一个文件:
```java
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class FileCopier {
private static final int THREAD_COUNT = 4; // 用户输入的线程数
public static void main(String[] args) {
String sourceDir = "用户输入的源文件夹路径"; // 原始文件夹路径
String targetDir = "用户输入的目标文件夹路径"; // 目标文件夹路径
List<String> filesToCopy = getFilesToCopy(sourceDir); // 获取需要复制的文件列表
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
try {
for (String file : filesToCopy) {
int threadIndex = Thread.currentThread().getId();
Future<Void> future = executor.submit(() -> copyFile(file, targetDir, threadIndex));
}
executor.shutdown();
while (!executor.isTerminated()) { } // 等待所有任务完成
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
executor.shutdownNow(); // 关闭线程池
System.out.println("文件夹内文件拷贝完成");
}
}
private static List<String> getFilesToCopy(String dirPath) {
List<String> fileList = new ArrayList<>();
File directory = new File(dirPath);
if (directory.exists() && directory.isDirectory()) {
for (File file : directory.listFiles()) {
if (file.isFile()) {
fileList.add(file.getAbsolutePath());
}
}
}
return fileList;
}
private static void copyFile(String srcFile, String destDir, int threadIdx) {
try {
String fileName = Paths.get(srcFile).getFileName().toString();
String destFilePath = Paths.get(destDir, fileName).toString();
Files.copy(Paths.get(srcFile), Paths.get(destFilePath));
System.out.printf("线程 %d: 文件 %s 已经复制到 %s\n", threadIdx, fileName, destFilePath);
} catch (IOException e) {
System.err.println("线程 " + threadIdx + ": 复制文件失败:" + e.getMessage());
}
}
}
```
请注意,此代码仅用于演示目的,实际应用中还需要处理可能出现的异常,并确保目录存在等条件。
阅读全文