孤叶翔云

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. Buffer与Channel

Java5中新增了nio包。与传统的BIO相比,NIO的效率更快。
NIO是面向缓冲区编程的,而传统的BIO是面向流的编程。
BIO中的数据是直接从流中读取和写出的,流是单向的,创建一个流对象只能完成读取或写出其中的一种任务。流对象既负责与文件/套接字连接,也要负责数据的读写。
而NIO中将数据的读写和连接分开,缓冲区(Buffer)只负责数据的存取,通道(Channel)只负责与文件/套接字建立连接。通道可以是双向的。

尚硅谷的老师对BIO和NIO有一个形象的比喻:
BIO就像是水龙头,数据就是水流,打开龙头,水流只能向一个方向流动;
NIO就像是铁路,Channel就是连接文件与内存之间的铁轨,而Buffer就是在这个铁轨上进行运输的火车。数据由火车运载,在内存/文件中的某一处装载数据,在另一处卸载数据。

1.1. Channel的read()和write()

创建一个Channel对象可以用如下方法:

FileChannel inChannel = new FileInputStream("01.txt").getChannel();
FileChannel outChannel = new FileOutputStream("02.txt").getChannel();

从输入流中获取的Channel是只读的,只能调用其read方法;从输出流中获取的Channel是只可写的,只能调用其write方法。

从Channel打开的连接中读取数据,并向Buffer中存入,这个过程是从外部读取数据到Java程序中(向内存中),因此调用的是:channel.read(destBuffer)方法。
从Buffer中拿到(读取)数据,并向Channel打开的连接中写入,这个过程是从Java程序中(内存)向外部写出数据,因此调用的是:channel.write(srcBuffer)方法。

posted on 2020-10-25 11:08  孤叶翔云  阅读(105)  评论(0编辑  收藏  举报