In Java NIO you can transfer data directly from one channel to another, if one of the channels is aFileChannel
. The FileChannel
class has atransferTo()
and a transferFrom()
method which does this for you.
FileChannel.transferFrom()
method transfers data from a source channel into the
FileChannel
. Here is a simple example:
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(position, count, fromChannel);
position
), and how many bytes to transfer maximally (
count
). If the source channel has fewer than
count
bytes, less is transfered.
Additionally, some SocketChannel
implementations may transfer only the data theSocketChannel
has ready in its internal buffer here and now - even if theSocketChannel
may later have more data available. Thus, it may not transfer the entire data requested (count
) from theSocketChannel
into FileChannel
.
transferTo()
method transfer from a
FileChannel
into some other channel. Here is a simple example:
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
object the method is called on. The rest is the same.
The issue with SocketChannel
is also present with the transferTo()
method. The SocketChannel
implementation may only transfer bytes from theFileChannel
until the send buffer is full, and then stop.
本文转自:http://tutorials.jenkov.com/java-nio/channel-to-channel-transfers.html