【Java】 FileChannel类来实现文件之间的数据传输

简单示例

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

猜你喜欢

转载自blog.csdn.net/AwesomeP/article/details/131495350