Java NIO-5.通道之间的数据传输

在Java NIO中,如果两个通道中有一个是FileChannel,可以将数据从一个通道中直接传输到另一个。FileChannel类有一个transferTo()和transferFrom()方法来完成。

transferFrom

FileChannel.transferFrom()方法可以将数据从源通道传输到FileChannel中,一个简单例子如下:

RandomAccessFile fromFile = new RandomAccessFile("./data/from-data.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();

RandomAccessFile toFile = new RandomAccessFile("./data/to-data.txt", "rw");
FileChannel toChannel = toFile.getChannel();

long position = 0;
long count = fromChannel.size();

toChannel.transferFrom(fromChannel, position, count);

position和count参数,指定目标文件写入的位置(position),和传输的最大字节数(count)。如果源文件字节数小于count,传输的就少一些。 另外,一些SocketChannel的实现可能仅传输当前网络上所属缓冲区已经准备好的数据,哪怕SocketChannel将来可能有更多的可用数据。因此,从SocketChannel传输到FileChannel中的数据可能不是完整的。

transferTo()

transferTo()方法将FileChannel中的数据传输到其他的通道中,例如:

RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel      fromChannel = fromFile.getChannel();

RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel      toChannel = toFile.getChannel();

long position = 0;
long count    = fromChannel.size();

fromChannel.transferTo(position, count, toChannel);

注意本例和前例的类似处。唯一不同的地方在于FileChannel对象调用的方法不同,其他的是一样的。

和SocketChannel存在的问题transferTo()方法也有。SocketChannel的实例可能从FileChannel中传输字节的时候,发送的缓冲区一满就停止。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券