Channel to Channel Transfers

在Java NIO中,你可以直接将数据从一个Channel传输(transfer)到另一个Channel,前提是其中一个ChannelFileChannelFileChannel类的transferTo()transferFrom()方法就是干这个的。

transferFrom()

FileChannel.transferFrom()方法可以将Channel的数据传输到FileChannel上。下面是个简单例子:

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

RandomAccessFile toFile = new RandomAccessFile("data/toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();
    
long position = 0;
long count = fromChannel.size();

toChannel.transferFrom(fromChannel, position, count);

参数positioncount代表目标文件从哪(position)开始写,最大(count)传输多少字节。如果源Channel的数据量没有count大,则只会传输源Channel数据量大小的数据。

此外,一些SocketChannel的实现只会传输该SocketChannel此时此刻已经读到内部Buffer的数据,尽管这个SocketChannel后续可能会读入更多数据。因此,它可能不会将请求(request)的全部(count)数据从SocketChannel传输至FileChannel

transferTo()

FileChannel.transferTo()方法可以将一个FileChannel的数据传输给另一个其他的Channel。下面是个简单例子:

RandomAccessFile fromFile = new RandomAccessFile("data/fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();
        
RandomAccessFile toFile = new RandomAccessFile("data/toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();
        
long position = 0;
long count = fromChannel.size();
        
fromChannel.transferTo(position, count, toChannel); // 只有这行不一样

注意,这个例子和前面的例子非常相似。唯一的不同就是调用方法的FileChannel对象不一样,其他都没变化。

SocketChannel的缺陷在transferTo()方法依然存在。SocketChannel的实现只会从FileChannel传输数据直至填满Buffer,然后就停止了。

说明

发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO。

你可能感兴趣的:(Channel to Channel Transfers)