Java NIO(New IO)是用于Java(来自Java 1.4)的替代IO API,意味着替代标准 Java IO和Java Networking API。Java NIO提供了与标准IO API不同的IO工作方式。
Java NIO:Channels和Buffers
在标准IO API中,您可以使用字节流和字符流。在NIO中,您使用通道和缓冲区。数据总是从通道读入缓冲区,或从缓冲区写入通道。
Java NIO:非阻塞IO(Non-blocking IO)
Java NIO使您可以执行非阻塞IO。例如,一个线程可以请求一个通道将数据读入缓冲区。当通道读取数据到缓冲区时,线程可以做其他事情。一旦数据被读入缓冲区,线程就可以继续处理它。将数据写入通道也是如此。
Java NIO:选择器(Selectors)
Java NIO包含“选择器”的概念。选择器是一个可以监视多个通道事件的对象(如:连接打开,数据到达等)。因此,一个线程可以监视多个通道的数据。
Java NIO由以下核心组件组成:
- Channels(通道)
- Buffers(缓冲区)
- Selectors(选择)
Java NIO拥有比这些更多的类和组件,但在我看来Channel
,Buffer
它Selector
构成了API的核心。其余的组件,像 Pipe
和FileLock
只是实用程序类与三个核心组件一起使用。因此,我将在本NIO概述中关注这三个组件。
频道和缓冲区
通常,NIO中的所有IO都从Channel
开始。 Channel
有点像小溪,从Channel
数据可以读取到一个Buffer
。数据也可以从Buffer
写入到Channel
中。这是一个例子:
Java NIO:通道将数据读入缓冲区,缓冲区将数据写入通道
有几个 Channel
和 Buffer
类型。以下是Channel
Java NIO中主要实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如您所见,这些通道涵盖UDP + TCP网络IO和文件IO。
这些类也有一些有趣的接口,但为了简单起见,我会将它们排除在Java NIO概述之外。在Java NIO教程的其他文章中,他们将在相关位置进行解释。
以下是Buffer
Java NIO 中的核心实现列表:
- ByteBuffer(字节缓冲区)
- CharBuffer(字符缓冲区)
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer
涵盖了您可以通过IO发送的基本数据类型:byte,short,int,long,float,double和characters。
Java NIO也有一个MappedByteBuffer
类,它是与内存映射文件结合使用的。尽管如此,我仍然将这一点从此概述中排除。
Selectors(选择)
一个Selector
允许单线程处理多个Channel
。如果您的应用程序有多个连接(通道)打开,但每个连接只有低流量,这很适用。例如,在聊天服务器中。
下面是一个使用一个 Selector
来处理3 的Channel
的例子:
Java NIO:一个线程使用一个选择器来处理3个通道
要使用你注册在Channel
的Selector
,你可以直接调 select()
方法。此方法将阻塞,直到有一个event准备好已注册的频道之一。一旦该方法返回,该线程就可以处理这些事件。event可理解为一些即将到来的connection,数据接收等。
Next:Java NIO Channel(二)