Java NIO系列教程(1): Java NIO 概述
hubuke
9年前
<p>Java NIO 由以下几个核心部分组成:</p> <ul> <li>Channels</li> <li>Buffers</li> <li>Selectors</li> </ul> <p>虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组 件会在单独的章节中讲到。</p> <h3>Channel 和 Buffer</h3> <p>基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:</p> <p><img alt="Java NIO系列教程(1): Java NIO 概述" src="https://simg.open-open.com/show/654a17932b5ea308f73200f077e6a4cb.png"></p> <p>Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:</p> <ul> <li>FileChannel</li> <li>DatagramChannel</li> <li>SocketChannel</li> <li>ServerSocketChannel</li> </ul> <p>正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。</p> <p>与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。</p> <p>以下是Java NIO里关键的Buffer实现:</p> <ul> <li>ByteBuffer</li> <li>CharBuffer</li> <li>DoubleBuffer</li> <li>FloatBuffer</li> <li>IntBuffer</li> <li>LongBuffer</li> <li>ShortBuffer</li> </ul> <p>这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。</p> <p>Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件, 我也不打算在概述中说明。</p> <h2>Selector</h2> <p>Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。</p> <p>这是在一个单线程中使用一个Selector处理3个Channel的图示:</p> <p><img alt="Java NIO系列教程(1): Java NIO 概述" src="https://simg.open-open.com/show/ed571e5b8793cae275479b761393a6f0.png"></p> <p>要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。</p> <p>译文出处: <a href="/misc/goto?guid=4959669891204054915">郭蕾</a> 原文出处:<a href="/misc/goto?guid=4959669891323455726" rel="nofollow">Jakob Jenkov</a></p>