java多线程复制文件
时间: 2024-08-14 12:08:40 浏览: 45
java多线程复制文件的实例代码
在Java中,使用多线程复制文件通常是为了提高性能,特别是当处理大文件时,可以同时读取源文件和写入目标文件,而不需要等待整个操作完成。这里是一个简单的示例,展示了如何使用`java.util.concurrent`包下的`TransferService`来实现线程安全的文件复制:
```java
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.*;
public class FileCopyingTask implements Callable<Integer> {
private final Path sourcePath;
private final Path destinationPath;
public FileCopyingTask(Path sourcePath, Path destinationPath) {
this.sourcePath = sourcePath;
this.destinationPath = destinationPath;
}
@Override
public Integer call() throws IOException {
try (InputStream in = Files.newInputStream(sourcePath);
OutputStream out = Files.newOutputStream(destinationPath)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
return bytesRead; // 返回复制的字节数,用于跟踪进度
}
}
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
Path sourceFile = Paths.get("source.txt");
Path destFile = Paths.get("destination.txt");
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定大小的线程池
Future<Integer>[] futures = new Future[executor.executeAll(Arrays.asList(
new FileCopyingTask(sourceFile, destFile.resolveSibling("part1")),
new FileCopyingTask(sourceFile, destFile.resolveSibling("part2")),
// ... 其他部分,如果需要的话
))];
for (Future<Integer> future : futures) {
// 等待所有任务完成,并获取每个任务返回的字节数
System.out.println(future.get());
}
executor.shutdown(); // 关闭线程池
}
}
```
在这个例子中,我们创建了一个固定大小的线程池,将文件复制任务分解成多个小的部分,每个部分由一个单独的线程执行。注意,由于IO操作本身通常是线程安全的,所以直接对输入流和输出流进行读写通常不需要额外同步。
阅读全文