博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java NIO系列教程(五) 通道之间的数据传输
阅读量:6966 次
发布时间:2019-06-27

本文共 1856 字,大约阅读时间需要 6 分钟。

在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。

transferFrom()

FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。下面是一个简单的例子:

package java_.nio_.demo;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class TransferFromMethodMain {    public static void main(String[] args) throws Exception {        RandomAccessFile rafFrom = new RandomAccessFile("E:/edu/FileChannelMain.txt", "rw");        RandomAccessFile rafTo = new RandomAccessFile("E:/edu/FileChannelMain.txt", "rw");        FileChannel fcFrom = rafFrom.getChannel();        FileChannel fcTo = rafTo.getChannel();        long position = 0;        long count = fcFrom.size();        fcTo.transferFrom(fcFrom, position, count);        ByteBuffer buf = ByteBuffer.allocate(1024);        int reads = fcTo.read(buf);        if(reads != -1){            buf.flip();            while(buf.hasRemaining()){                System.out.print((char)buf.get());            }            buf.clear();        }    }}

方法的输入参数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被填满。

转载地址:http://xofsl.baihongyu.com/

你可能感兴趣的文章
MySQL索引的学习和研究
查看>>
Docker部署文档
查看>>
VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径
查看>>
Ubuntu下安装ruby的三种方式
查看>>
nginx location 配置详细解释
查看>>
nginx FastCGI错误Primary script unknown解决办法
查看>>
Systemd 笔记
查看>>
AngularJS实现产品列表(页面搜索,排序)
查看>>
php后台守护进程+进程信号处理
查看>>
Effective Python 小笔记之 zip 函数
查看>>
组网中交换机虚拟化技术的应用
查看>>
面向对象的最后一课
查看>>
rsync使用小结
查看>>
Docker安装mysql容器
查看>>
win7 64位系统连接xp 32位共享打印机办法
查看>>
使用功能开关更好地实现持续部署
查看>>
熔断,限流,降级 一些理解
查看>>
FreeBSD下安装配置Hadoop集群(四)
查看>>
cPanel之EasyApache (Apache Update)的使用
查看>>
VS2008修改工程名
查看>>