在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
实现类的问题同样存在。