在Java中,NIO读写是I/O的基本过程。 从通道读取:创建一个缓冲区,然后请求通道读取数据。通道写入:创建一个缓冲区,填充数据,并要求通道写入数据。
读写操作中使用的核心部件有:
- Channels
- Buffers
- Selectors
Java NIO还有其它更多的组件和类,但是Channel
,Buffer
和Selector
用作API的核心。
通道和缓冲区
在标准I/O API中,使用字符流和字节流。 在NIO中使用通道和缓冲区。 NIO中的所有I/O都是通过一个通道开始的。数据总是从缓冲区写入通道,并从通道读取到缓冲区。
数据读取操作:
下面来看看将数据从通道读入缓冲区,如下图所示:
数据写入操作:
下面来看看从缓冲区将数据写入通道,如下图所示:
通道列表
在Java NIO中,主要使用的通道如下:
- DatagramChannel
- SocketChannel
- FileChannel
- ServerSocketChannel
上述通道涵盖UDP(用户数据报协议)+ TCP(传输控制协议)网络I/O和文件I/O。
缓冲列表
在Java NIO中使用的核心缓冲区如下:
- CharBuffer
- DoubleBuffer
- IntBuffer
- LongBuffer
- ByteBuffer
- ShortBuffer
- FloatBuffer
上述缓冲区覆盖了通过I/O发送的基本数据类型:characters
,double
,int
,long
,byte
,short
和float
。
选择器
Java NIO提供了“选择器”的概念。这是一个可以用于监视多个通道的对象,如数据到达,连接打开等。因此,单线程可以监视多个通道中的数据。
如果应用程序有多个通道(连接)打开,但每个连接的流量都很低,则可考虑使用它。 例如:在聊天服务器中。
下面来看看线程使用选择器来处理3
个通道,如下图所示: