Java NIO Channel to Channel Transfers

Java NIO 管道传送器,原文地址:http://tutorials.jenkov.com/java-nio/channel-to-channel-transfers.html

在 Java NIO 中,如果两个管道中有一个管道是文件管道(FileChannel),那么你可以把数据从一个管道传递到另外一个管道中。文件管道中有 transferTo()transferFrom() 方法可以实现数据在管道间传递。

transferFrom()

方法 FileChannel.transferFrom() 可以将一个管道中的数据传递到一个文件管道中。下面是一个简单的使用实例:

1
2
3
4
5
6
7
8
9
10
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);

toChannel.transferFrom() 方法中的参数 positioncount 表示向目的管道 toChannel 传递数据时从何处(position)开始,以及传递多少个(count)数据。如果源管道(fromChannel)中没有那么多数据,那么只会传递其中所有的数据。
另外需要注意的是,一些套接字管道实现只会传递套接字管道目前中有的数据,即使之后该套接字管道中可能会有更多的数据。

transferTo()

transferTo() 方法可以将一个文件管道中的数据传递到其他管道中,下面是使用它的一个小例子:

1
2
3
4
5
6
7
8
9
10
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);

有没有注意到这个例子跟上一个例子是极其相似的。唯一的不同是文件管道对象调用方法不同而已,剩下的都是相同的。
套接字管道的问题在这里仍然存在。(PS:这一段是在看不懂,就不翻译了吧)