在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中传输字节的时候,发送的缓冲区一满就停止。