参考:http://ifeve.com/java-nio-channel-to-channel/
原文地址
目录
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之间的数据传输
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服务器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
在Java NIO中,如果两个通道中有一个是FileChannel
,那你可以直接将数据从一个channel
(译者注:channel中文常译作通道)传输到另外一个channel
。
transferFrom()
FileChannel
的transferFrom()
方法可以将数据从源通道传输到FileChannel
中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。下面是一个简单的例子:
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
表示从position
处开始向目标文件写入数据,count
表示最多传输的字节数。如果源通道的剩余空间小于 count
个字节,则所传输的字节数要小于请求的字节数。
此外要注意,在SoketChannel
的实现中,SocketChannel
只会传输此刻准备好的数据(可能不足count
字节)。因此,SocketChannel
可能不会将请求的所有数据(count
个字节)全部传输到FileChannel
中。
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);
是不是发现这个例子和前面那个例子特别相似?除了调用方法的FileChannel
对象不一样外,其他的都一样。
上面所说的关于SocketChannel
的问题在transferTo()
方法中同样存在。SocketChannel
会一直传输数据直到目标buffer
被填满。