所有文章
https://www.cnblogs.com/lay2017/p/12901123.html
正文
在Java NIO当中,如果两个Channel中有一个Channel是FileChannel,你可以直接从一个Channel将数据传到另一个Channel。FileChannel中包含了transferTo和transferFrom方法
transferFrom
transferFrom方法将数据从一个Channel中读入到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指定了读取多少。
注意:如果是SocketChannel,可能传输的是当前SocketChannel内部的Buffer包含的数据,而不是请求的全部数据。
transferTo
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);
和之前的代码很相似,只是调用了不同的方法,数据流向不同而已。
之前SocketChannel存在的问题,这里也一样存在。transferTo方法将从FileChannel传输数据到SocketChannel,直到SocketChannel内部的Buffer满了以后,就会停止,但不意味着FileChannel的数据被传送完整。