NIO的缓冲区
- Java IO面向流意味着每次从流中读取一个或多个字节,直到读取所有字节,他们没有被缓存在任何地方
- 此外,它不能前后移动流中的数据。如果需要前后移动从流中读取数据,需要将它先缓存到一个缓冲区
- NIO的缓冲导向方法不同,数据读取到一个它稍后处理的缓冲区,需要时可以在缓冲区前后移动,增加了处理过程中的灵活性
- 但是,需要检查该缓冲区是否包含需要处理的数据,且,需要确保更多的数据进入缓冲区时,不能覆盖未处理的数据
NIO的非阻塞
- IO各种流是阻塞的,即当一个线程调用read() 或者 write()时,该线程被阻塞,直到有一些数据被读取到或数据完全写入,该线程在此期间不能做其他事情了
- NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能读取到目前可用的数据
- 如果当前没有数据可用,就什么都不会获取,而不是保持线程阻塞。所以直至数据变为可读前,该线程可以继续做其他的事情
- 非阻塞的写也是如此,一个请求写入一些数据到某通道,但不需要等它待完全写入,这个线程可以去做别的事情
- 线程通常将非阻塞IO的空闲时间用于其他通道上执行IO操作,所以一个单独的线程可以管理多个输入和输出通道
Channel(通道)
- Channel双向,可以读、写(IO 中的stream为单向的,比如InputStream、 OutputStream)
Buffer(缓冲区)
- 实际是一个容器(一个连续数组)
- Channel提供从文件、网络读取数据的通道,但读、写必须经过Buffer
- Buffer为顶层父类、抽象类,它的子类有:ByteBuffer、IntBuffer、CharBuffer、LongBuffer、DoubleBuffer、FloatBuffer、ShortBuffer
Selector(选择区)
- Selector类是NIO的核心类
- Selector通过检测多个注册通道上是否有事件发生来对每个事件进行相应的响应处理
(未完待续)