Java NIO(二)API基本概述
Java NIO 由以下几个核心部分组成:
- Channel
- Buffer
- Selector
Channel(通道)可以理解为对IO操作的优化,传统IO基于流操作,读只能用输入流,写只能用输出流。流都是单向的,而通道是双向的,既可以基于通道进行写,也可以进行读。Channel的几个实现类:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
Buffer(缓冲区)可以理解为利用通道进行读写数据时的容器,通道内是不能直接存入数据的,只能接受Buffer。Buffer的实现类:这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Buffer还有一个实现类MappedByteBuffer,是利用内存文件映射读写文件时用到的,在上一篇文章结尾的例子中有用到。
Selector(选择器)可以实现单线程操作多个通道,更像是一个监听器,不断的轮训每个通道,根据每个通道里面注册的不同的事件,进行不同的操作。选择器的事件:
- SelectionKey.OP_CONNECT //连接
- SelectionKey.OP_ACCEPT //接受连接
- SelectionKey.OP_READ //读事件
- SelectionKey.OP_WRITE //写事件
举个例子,就像一个大饭店坐满了人,但是只有一个服务员,服务员需要不停的来回走动,发现有那一桌客人需要被服务,就立即处理。服务员来回走动的过程就是Selector不断轮寻的过程,只有一个服务员相当于单线程,饭店里的每一桌相当于一个通道。
由此可知:Selector适合每个通道的数据量都不是很大时使用,否则就会出现一个通道一直在等待被处理的情况,而且并不适用于高并发,会使程序直接崩掉。
下图来自互联网: