NIO通道的学习笔记

个人感觉通道就像传送带一样,这边把数据包装一下里往带子上一放,另一头就收到了,在这个例子中,包装就是数据扔到Buffer中得过程,传送的载体就是Channel。

 

基础

Channel接口就俩操作isOpen()查看状态,close()关闭。

通道分两大类,文件通道和Socket通道,后者有相关的工厂方法(open),前者只能通过RandomAccessFile,FileInputStream和FileOutputStream对象上调用getChannel方法来获取。

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而 通道 可以用于读、写或者同时用于读写。

通道可以以阻塞和非阻塞模式运行,非阻塞模式的通道永远不会让线程休眠。请求的操作要么立即完成要么返回一个结果表明未进行任何操作。只有面向流的通道才可以使用非阻塞模式。

通道不能被重复利用,一个打开的通道即表明与一个特定的I/O服务的特定连接并且封装了该连接的状态。通道关闭的时候那个连接就木有了。

通道被关闭的时候可能会被阻塞,这时候用isOpen()来查看相关状态还是蛮有必要得。

 

Scatter/Gather

Scatter从一个Channel读取的信息分散到N个Buffer中,Gather将N个Buffer里面内容按照顺序发送到一个Channel。

这东西用好了很碉堡,用不好就…

 

文件通道

阻塞式的,不能置于非阻塞模式。文件通道是线程安全的,关键操作都是单线程的,一个操作在进行中,其它操作需要等待。

使用的时候也是read和write,没啥太大区别,就是关闭的时候记得先关通道再关文件。文件通道可以加锁,不过记得在finally中释放锁。

文件通道还有一个Channel-Channel的功能,通过调用transferTo和transferFrom来调用,但这情况下,至少一端得是FileChannel,所以甭指望俩SocketChannel互相传了,这是没戏的。

 

内存映射文件

新的FileChannel类提供了一个map()方法,该方法可以在一个打开的文件和一个特殊类型得ByteBuffer之间形成一个虚拟内存映射。通过这种机制访问文件效率非常高,有时候比用通道还快,结合文件锁来用的话简直碉堡了。map方法映射的范围不能超过文件大小,否则文件就被扩充到那么大。

映射的模式有只读、读写和写拷贝(copy-on-write)三种,只读方式打开的文件映射读写模式就抛异常了,但是读写模式打开的文件映射只读模式是ok的。

写拷贝模式意味着通过put()做的修改都会导致一个私有的数据拷贝并且该拷贝只能被那个MappedByteBuffer看到。该过程不会对底层文件做出修改。虽然不会修改文件内容,但是用这映射模式时,文件仍然必需以读写权限打开。

 

Socket通道

自打有了这玩意儿,就不需要每个socket使用一个线程了,而且它可以置为非阻塞模式。

然后就是ServerSocketChannel(包装了ServerSocket的Channel),同理SocketChannel和DatagramChannel也是一样

 

管道

java.nio.channels包中含有一个名为Pipe(管道)的类,广义上讲,管道就是一个用来在两个实体之间单向传输数据的导管,管道通常被用来连接一个进程的输出和另一个进程的输入。Pipe类实现一个管道范例,不过它所创建的管道是进程内(在Java虚拟机进程内部)而非进程间使用的。

管道由一对通道组成:一个可写入的 sink 通道和一个可读取的 source 通道。一旦将某些字节写入接收器通道,就可以按照与写入时完全相同的顺序从源通道中读取这些字节。

转载于:https://www.cnblogs.com/Cratical/archive/2012/08/22/2650664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值