在Java NIO中,如果有两个Channel且其中一个是FileChannel时,我们可以传递数据从一个channel到另一个channel。FileChannle类提供了transferTo()和transferFrom()方法来操作。
transferFrom()
FileChannel.transferFrom()方法可以实现从一个源Channel到当前Channel的数据传递。
下面是一段示例代码:
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();
toChannel.transferFrom(fromChannel, position, count);
参数position 和 count, 决定了toChannel的写入位置和传递数据的大小。如果fromChannel的实际大小比count小,则只会传递实际大小的数据。
另外,如果fromChannel是SocketChannel的实现类,则只会传递已经在内部缓存区准备好的数据,可能不会将所有(count)数据都传递过来。
transferTo()
FileChannel.transferTo() 方法可以实现数据从FileChannel到另外一个channel的传递。
下面是一段示例代码:
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);
与transferFrom()很相似,另外,对于SocketChannel实现类的问题同样存在。