01-Java NIO 概述

1 背景

1.1 简介

java.nio 全称 java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

1.2 为什么需要NIO

在 java 最初的 IO 中,OutputStream 和 InputStream 没有提供异步的的 IO 读写,并且服务器端的 accept() 方法是阻塞的。这意味着在客户端中需要采用一个线程对应一个客户端连接的策略来保证服务器可以同时接受来自多个客户端的连接。这就会导致大量的系统开销和负担。这种阻塞的通信模式也正是 NIO 所要解决的主要问题!

1.3 NIO 和 IO 的区别

NIO            IO

非阻塞        阻塞

面向缓冲 (buffer)面向流(stream)

有选择器    无

2 核心构成

2.1 Channel(通道)

Java NIO 的通道类似流,但又有些不同:

通道既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

通道可以异步地读写。

通道中的数据总是要先读到一个 Buffer,或者总是要从一个 Buffer 中写入。

Java NIO中最重要的通道的实现:

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。

SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel 可以监听新进来的 TCP 连接,像 Web 服务器那样。对每一个新进来的连接都会创建一个 SocketChannel。

2.2 Buffer(缓冲区)

Java NIO 中的 Buffer 用于和 NIO 通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。

缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。

Java NIO 有以下Buffer类型:

ByteBuffer

MappedByteBuffer

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

上述缓冲区覆盖了通过 I/O 发送的基本数据类型:character、double、int、long、byte、short 和 float。

2.3 Selector(选择器)

选择器是 Java NIO 中能够检测一到多个 NIO 通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个 channel,从而管理多个网络连接。

3 总结

3.1 Java NIO: 单线程管理多个连接

NIO 可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。

如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。

3.2 Java IO: 单线程管理单个连接

如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。

---- 更多内容欢迎关注 ----


01-Java NIO 概述_第1张图片

你可能感兴趣的