Java NIO通道到通道的传输

时间:2020-01-09 10:36:15  来源:igfitidea点击:

在Java NIO中,如果其中一个通道是" FileChannel",则可以将数据直接从一个通道传输到另一个通道。 FileChannel类具有一个transferTo()和transferFrom()方法,可以为我们完成此操作。

transferFrom()

FileChannel.transferFrom()方法将数据从源通道传输到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();

toChannel.transferFrom(fromChannel, position, count);

参数position和count告诉目标文件中要开始写入的位置(" position"),以及最大传输的字节数(" count")。如果源通道的字节数少于count字节,则传输的字节数更少。

另外,某些" SocketChannel"实现可能只在此处和现在传输" 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传输字节,直到发送缓冲区已满,然后停止。