Java NIO学习笔记一 Java NIO概述

时间:2021-12-11 16:55:54

Java NIO概述

Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API。Java NIO提供了与标准IO API不同的IO工作方式。

Java NIO由以下核心组件组成:

  • 通道
  • 缓冲区
  • 选择器

除了ChannelBuffer 并Selector,Java NIO还有其他更多的类和组件。但是ChannelBuffer 和Selector构成了Java NIO API的核心。我认为,其他的组件,像 PipeFileLock只是结合三个核心组件一起使用的工具类。因此,本章我将重点介绍NIO概述中的这三个核心组件。

通道和缓冲区

通常,NIO中的所有IO都以一个通道开始通道有点像流。数据从通道可以读入缓冲区。数据也可以从一个缓冲区写入通道

在标准IO API中,你编码使用是字节流和字符流。在NIO中,你编码使用是通道和缓冲区。使用NIO读取数据,数据总是从通道读入缓冲区,或从缓冲区写入通道。

如图:

Java NIO学习笔记一      Java NIO概述
Java NIO:通道将数据读入缓冲区,缓冲区将数据写入通道

ChannelBuffer有几种类型。以下是通道在Java NIO 主要实现的列表:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

通过上面的实现可以看出,这些通道涵盖UDP + TCP网络IO和文件IO。

还有一些有趣的接口也伴随着这些类,但是为了方便理解,我将把它们放在Java NIO概述之外。将在相关的Java NIO教程的其他文本中进行说明。

下面是缓冲区Java NIO 中的核心实现的列表:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffer覆盖了您可以通过IO发送的基本数据类型:byte,short,int,long,float,double和characters。Java NIO还具有一个MappedByteBuffer,是与内存映射文件配合使用的。

Java NIO:非阻塞IO

Java NIO支持执行非阻塞IO。例如,线程访问一个通道将数据读入到缓冲区。当通道将数据读入缓冲区时,线程还可以执行其他操作。一旦数据读入缓冲区,线程就可以继续处理它。线程执行将数据写入通道也是如此。

选择器

Java NIO还有一个新的概念“选择器”。选择器是一个能够监视事件的多个通道的对象(例如:打开连接,数据到达等等)。因此,单线程可以监视多个通道的数据。

一个选择器允许单个线程处理多个通道。如果您的应用程序有许多连接(通道)打开,但每个连接的流量都比较低,这是方便的。例如,在聊天服务器中。

如图:一个线程使用一个选择器来处理3个通道的:

Java NIO学习笔记一      Java NIO概述
Java NIO:A Thread uses a Selector to handle 3 Channel's

注册一个通道来使用选择器。称之为 select()方法。该方法将阻塞,直到有一个注册通道的事件准备就绪。一旦方法有返回值,线程就可以处理这些事件。通道事件是传入连接,数据接收等

原文:http://tutorials.jenkov.com/java-nio/overview.html