使用java,多线程拷贝指定文件夹下的文件(不考虑子文件夹,只考虑当层文件夹下的文件),单个线程拷贝单个文件。原文件夹名、目标文件名由用户输入。所有线程完成工作后,输出“文件夹内文件拷贝完成”的消息。
时间: 2024-10-13 21:16:03 浏览: 40
在Java中,可以使用`ExecutorService`和`Future`来管理多线程任务,同时利用`Files.copy()`函数复制文件。以下是简单的步骤和示例代码来实现这个功能:
1. **创建线程池**:
```java
ExecutorService executor = Executors.newFixedThreadPool(5); // 根据实际需要调整线程数
```
2. **定义复制文件的函数**,这里作为Callable任务,因为我们可以获取结果(即文件是否成功复制):
```java
Callable<Void> copyFileTask(String srcPath, String destPath) {
return () -> {
try {
Files.copy(Paths.get(srcPath), Paths.get(destPath));
System.out.println("文件 " + srcPath + " 已复制到 " + destPath);
} catch (IOException e) {
System.out.println("复制文件失败:" + e.getMessage());
}
return null; // 返回null表示任务已完成
};
}
```
3. **提交任务到线程池,并获取Future对象**:
```java
String[] filesToCopy = ... // 用户输入的源文件路径数组
for (String file : filesToCopy) {
Future<Void> future = executor.submit(copyFileTask(file, getDestinationFilePath(file))); // 获取目标文件名函数
}
```
4. **处理任务完成后关闭线程池并输出消息**:
```java
executor.shutdown();
while (!executor.isTerminated()) {} // 等待所有线程完成
System.out.println("文件夹内文件拷贝完成");
```
5. **获取目标文件名的辅助函数**(这里假设目标文件名是源文件名加上用户输入的目标文件夹名):
```java
private String getDestinationFilePath(String filePath) {
// 用户输入的目标文件夹名
String targetFolderName = ...;
// 这里假设目标路径是原始路径基础上增加目标文件夹名
return filePath.replace(originalFolderName, targetFolderName);
}
```
阅读全文