JAVA-NIO入门

JAVA-NIO入门

在 JDK 1. 4 中 新 加入 了 NIO( New Input/ Output) 类, 引入了一种基于通道和缓冲区的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆的 DirectByteBuffer 对象作为这块内存的引用进行操作,避免了在 Java 堆和 Native 堆中来回复制数据。

JAVA-NIO应用场景

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂

JAVA-NIO特点

  • 面向缓冲区,传输效率高
  • 非阻塞
  • IO多路复用

JAVA-NIO三的核心

  • Channel (通道)
  • Buffer (缓冲区)
  • Selector (选择器)

1 -> Channel (通道)

Channel可以理解成IO中的Stream。只不过Stream是单向的(要么读,要么写)。而Channel是双向的,读写可以切换。详细介绍 JAVA-NIO入门之通道(channel)

Nio中Channel的实现
  • FileChannel    / 文件IO
  • DatagramChannel  / UDP
  • SocketChannel  / TCP客户端
  • ServerSocketChannel  / TCP服务端

2-> Buffer (缓冲区)

缓冲区本质上可以理解成一块内存。可以读写数据,在NIO中,被封装成Buffer。详细介绍 JAVA-NIO入门之缓冲区(Buffer)

Nio中Buffer的实现
  • ByteBuffer 基本类型 byte
  • CharBuffer 基本类型 char
  • DoubleBuffer 基本类型 double
  • FloatBuffer 基本类型 float
  • IntBuffer 基本类型 int
  • LongBuffer 基本类型 long
  • ShortBuffer 基本类型 short
  • MappedByteBuffer
  • HeapByteBuffer
  • DirectByteBuffer

3-> Selector(选择器)

Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。详细介绍 JAVA-NIO入门之选择器(Selector)

Selector 一般称 为选择器 ,当然你也可以翻译为 多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。

nio-selector.jpg

使用Selector的优点
使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。
返回笔记列表
入门小站