简单示例
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
String FROM = "data.txt"; // 文件路径
String TO = "to.txt";
try (FileChannel from = new FileInputStream(FROM).getChannel();
FileChannel to = new FileOutputStream(TO).getChannel();
)
{
from.transferTo(0, from.size(), to);
} catch (IOException e) {
e.printStackTrace();
}
在try语句块中,通过调用from.transferTo()方法将数据从源文件通道(from)传输到目标文件通道(to)。该方法的第一个参数是源文件通道的起始位置,这里设置为0,表示从文件的开头开始传输。第二个参数是要传输的字节数,这里使用from.size()获取源文件的大小。第三个参数是目标文件通道。
超过2G大小的文件传输
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class TestFileChannelTransferTo {
public static void main(String[] args) {
try (
FileChannel from = new FileInputStream("data.txt").getChannel();
FileChannel to = new FileOutputStream("to.txt").getChannel();
) {
// 效率高,底层会利用操作系统的零拷贝进行优化, 一次最多传输2G数据
long size = from.size();
// left 变量代表还剩余多少字节
for (long left = size; left > 0; ) { // 多次传输,以解决最多传输2G的问题
System.out.println("position:" + (size - left) + " left:" + left);
left -= from.transferTo((size - left), left, to); // 减去实际传输的字节数量
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建一个FileInputStream对象和一个FileOutputStream对象,并通过它们的getChannel()方法获取对应的FileChannel对象。
循环传输文件数据,直到剩余字节数left为0。
在每次循环中,通过调用from.transferTo()方法将数据从源文件通道(from)传输到目标文件通道(to)。
- 第一个参数是源文件通道的当前位置,这里使用(size - left)来设置位置,确保从文件的剩余部分的开始进行传输。
- 第二个参数是每次传输的最大字节数,这里使用left,表示剩余字节数。
- 第三个参数是目标文件通道,即要传输到的文件通道。
通过减去实际传输的字节数量left,更新剩余字节数。
如果在传输过程中发生IOException异常,会捕获并打印异常信息。
这段代码的目的是将一个名为"data.txt"的文件的数据传输到另一个名为"to.txt"的文件中。它使用了FileChannel的transferTo()方法来实现高效的数据传输,利用操作系统的零拷贝机制进行优化。每次传输的数据量最大为2G,通过多次传输来解决超过2G的数据量的问题。
参考:https://www.bilibili.com/video/BV1py4y1E7oA?p=16