NIO 0.1 笔记

本文深入探讨Java NIO(非阻塞I/O)的核心概念,包括Buffer、Channel和Selector。Buffer提供了数据存储和读写的灵活性,Channel用于数据传输,而Selector实现了多路复用,允许非阻塞地处理多个通道的事件。通过理解这些组件,开发者可以更高效地处理并发I/O操作。

IO是面向流的,NIO是面向缓冲区的

标准的IO编程接口是面向字节流和字符流的。而NIO是面向通道和缓冲区的,数据总是从通道中读到buffer缓冲区内,或者从buffer缓冲区写入到通道中;( NIO中的所有I/O操作都是通过一个通道开始的。)

Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;

Java NIO是面向缓存的I/O方法。 将数据读入缓冲器,使用通道进一步处理数据。 在NIO中,使用通道和缓冲区来处理I/O操作。

NIO包含下面几个核心的组件:

Buffers:一个可以变换读写模式,可以指定大小的数据块。

Channels:一个用于运输数据块的通道,可以从文件流中生成,也可以从自己创建。

Selectors:一个用于实现多路复用的选择器,可以和多个通道绑定触发事件,然后阻塞线程等待触发生成触发事件

SelectionKey:通道和选择器绑定时生成,里面几乎有两者的所有信息。

非阻塞:Selectors里的非阻塞是指,不会单一为一个线程阻塞。selector.select()会定时轮询选择器上的触发事件,有的话就继续执行。

Buffer--------------
一个Buffer有三个属性是必须掌握的,分别是:

capacity容量

position位置

limit限制

写数据到Buffer有两种方法:
从Channel中写数据到Buffer//nio.read(tb)
手动写数据到Buffer,调用put方法//cb.put("String is this");

从Buffer读数据也有两种方式。
从buffer读数据到channel//nio.write(tb);
从buffer直接读取数据,调用get方法//cb.get();

flip()方法可以吧Buffer从写模式切换到读模式。调用flip方法会把position归零,并设置limit为之前的position的值。 
也就是说,现在position代表的是读取位置,limit标示的是已写入的数据位置。

clear,filp,rewind的区别 :ps:一般用filp切换模式,clear清空缓存 ,rewind写模式下重头写。
 Channel------------------
通常来说NIO中的所有IO都是从 Channel(通道) 开始的。

从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

Channel有四种类型,其中FileChannel是文件操作,必须阻塞。其他三种用于网络传输,可以不阻塞。

Selector-------
Selector选择器是核心,可以实现多路复用的非阻塞情况。
web:https://ifeve.com/selectors/
        所有的Channel都归Selector管理,这些channel中只要有至少一个有IO动作,
        就可以通过Selector.select方法检测到,并且使用selectedKeys得到这些有IO的channel,然后对它们调用相应的IO操作。
大概:
    通道channel注册到选择器中,并且指明该通道什么情况激活,
    如:当接受到一个连接请求的时候激活;当可读操作时激活,可写操作时激活。

SelectionKey----
SelectionKey key = channel.register(selector,Selectionkey.OP_READ);
关键字对象负责连接channel与selector,
可以从SelectionKey获取两者,也可以获取选择器监听这个通道什么事情,也可以获取这个通道触发了什么事件。
SelectionKey属性:
   interest集合 (待唤醒的事件)
   ready集合 (已唤醒的事件)
   Channel连接的通道
   Selector连接的选择器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值