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

被折叠的 条评论
为什么被折叠?



