看到一个国外的作者写的关于java的文章还不错,于是便翻译过来了,再加上自己的一些理解
原文地址:Java NIO Overview
Java NIO主要由下面三个核心组件构成:
- Channels(通道)
- Buffers(缓冲)
- Selectors(选择器)
除了上面三个,java nio还有许多的类和组件,但是 Channel、Buffer和Selector组成了核心的API。剩下的组件,比如 Pipe和FileLock仅仅是当我们使用上面三个核心组件的时候使用到的一些帮助类(utility classes),因此在这篇NIO 概述中我主要集中谈这三个组件,其他的会在本教程的其他地方进行讲解。
Channels and Buffer
通常,NIO中的所有IO都以通道(Channle)开始,通道有点像流,通道里的数据可以读取到一个缓冲(Buffer)中,同样也可以将缓冲中的数据写入到一个通道里去,就像下面的例子一样:
Java中提供了几个不同类型的Channel和Buffer,下面列出了在Java NIO中几个主要的Channel实现类:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
正如你看到的,上面这些Channel的实现类包含了网络IO中的UDP+TCP以及文件IO。
伴随着这些类,java还提供了一些有意思的接口,但为了简单起见,暂时不讲,当出现与这些接口相关的内容的时候会讲解。
下面列出的是在java nio中Buffer的一些核心的实现类:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
上面这些buffer实现类包含了可以通过IO传输的基本数据类型:byte
, short
, int
, long
, float
, double
和字符。
Java NIO中还包含一个 MappedByteBuffer
用来与内存映射文件(memory mapped files)结合使用,本文中将略过。
Selectors(选择器)
一个选择器允许单个线程去处理多个通道,当你的程序打开了许多的连接,但每个连接的流量比较少(low traffic),即通信数据量少,使用Selector很方便。比如聊天服务器。
下面展示的例子是单个线程使用一个Selector处理三个Channels:
为了使用Selector,首先注册Channel到Selector上面,然后调用选择器的 select()
方法,这个方法会一直阻塞直到注册的通道中的任何一个有一个事件就绪(比如 incoming connection、data received),一旦该方法返回,线程便可以处理这些事件。