在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。
transferFrom()
FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中
public static final void c1(String sourceFile,String targetFile) throws IOException {
RandomAccessFile source = new RandomAccessFile(sourceFile,"rw");
FileChannel sourceChannel = source.getChannel();
RandomAccessFile target = new RandomAccessFile(targetFile,"rw");
FileChannel targetChannel = target.getChannel();
sourceChannel.transferTo(0,sourceChannel.size(),targetChannel);
}
- 第一个参数position:position表示从position处开始向目标文件写入数据
- 第二个参数count:count表示最多传输的字节数,如果源通道的剩余空间小于 count 个字节,则所传输的字节数要小于请求的字节数。
- 第三个参数target:target表示要传输的目标Channel
在SoketChannel的实现中,SocketChannel只会传输此刻准备好的数据(可能不足count字节)。因此,SocketChannel可能不会将请求的所有数据(count个字节)全部传输到FileChannel中。
transferTo
transferTo()方法将数据从FileChannel传输到其他的channel中。
public static final void c1(String sourceFile,String targetFile) throws IOException {
RandomAccessFile source = new RandomAccessFile(sourceFile,"rw");
FileChannel sourceChannel = source.getChannel();
RandomAccessFile target = new RandomAccessFile(targetFile,"rw");
FileChannel targetChannel = target.getChannel();
targetChannel.transferTo(0,sourceChannel.size(),sourceChannel);
}
上面所说的关于SocketChannel的问题在transferTo()方法中同样存在。SocketChannel会一直传输数据直到目标buffer被填满。
网友评论