java多线程复制小程序
时间: 2023-09-23 17:04:44 浏览: 45
以下是一个简单的 Java 多线程复制小程序,可以将一个文件复制到另一个位置:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws InterruptedException {
String sourceFile = "path/to/source/file";
String destFile = "path/to/destination/file";
int bufferSize = 1024; // 缓冲区大小,可以根据实际情况调整
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile)) {
byte[] buffer = new byte[bufferSize];
int read;
while ((read = fis.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
这是一个单线程的文件复制程序,可以复制小文件。但是如果要复制大文件,可能需要花费很长时间。因此,可以使用多线程来加速文件复制过程。
以下是一个使用多线程实现的文件复制程序:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws InterruptedException {
String sourceFile = "path/to/source/file";
String destFile = "path/to/destination/file";
int bufferSize = 1024; // 缓冲区大小,可以根据实际情况调整
int threadCount = 4; // 线程数,可以根据实际情况调整
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile)) {
long fileSize = fis.available(); // 获取文件大小
long blockSize = (fileSize + threadCount - 1) / threadCount; // 计算每个线程需要处理的字节数
for (int i = 0; i < threadCount; i++) {
long startPos = i * blockSize; // 计算起始位置
long endPos = Math.min(startPos + blockSize, fileSize); // 计算结束位置
Thread t = new CopyThread(fis, fos, startPos, endPos, bufferSize);
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class CopyThread extends Thread {
private FileInputStream fis;
private FileOutputStream fos;
private long startPos;
private long endPos;
private int bufferSize;
public CopyThread(FileInputStream fis, FileOutputStream fos, long startPos, long endPos, int bufferSize) {
this.fis = fis;
this.fos = fos;
this.startPos = startPos;
this.endPos = endPos;
this.bufferSize = bufferSize;
}
@Override
public void run() {
try {
fis.skip(startPos); // 跳过已经处理过的字节
byte[] buffer = new byte[bufferSize];
long count = 0;
int read;
while (count < endPos - startPos && (read = fis.read(buffer)) != -1) {
fos.write(buffer, 0, read);
count += read;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
这个程序使用了多个线程来复制文件,每个线程负责复制文件的一部分。首先计算出每个线程需要处理的字节数,然后创建多个线程,并分配给它们不同的起始位置和结束位置。每个线程在处理文件时,先跳过已经处理过的字节,然后按照缓冲区大小读取数据,并写入目标文件中。通过多个线程并发执行,可以加速文件复制过程。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)