Java NIO-1.概述

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

  • Channels
  • Buffers
  • Selectors Java NIO拥有的类和组件比这些要多,但是channel,BufferSelector组成了这个API的核心。在我(原作者)看来,像Pipe和`FileLock这些类仅仅只是用于将这三个核心组件结合在一起用的。所以,概述这一节仅关注这三个组件,其他组件在其他单独的章节中介绍。

Channels和Buffers

一个典型的NIO从Channels开始。Channel有点像流,数据能从Channel读到Buffer中,也能从Buffer写到Channels中。如下图所示:

Channels read data into Buffers, and Buffers write data into Channels

Channel和Buffer有好几种类型,下面是Java NIO的几种实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

可以看到,这些通路涵盖了UDP和TCP网络IO以及文件IO。 和这些类一起也有一些有趣的接口,简洁起见,概述一节不做介绍,在本教程其他涉及到他们的地方再做解释。

下面是Java NIO中Buffer的一些核心的实现:

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

这些Buffer涵盖了你能通过IO传输的基础数据类型:字节,短整型,整型,长整型,浮点数,双精度浮点数和字符。 Java NIO还有一个MappedByteBuffer,用于将内存映射文件关联起来。这里也省略不做介绍。

Selector

Selector允许单个线程处理多个Channel。如果应用打开了很多连接(Channels),但是每个连接的流量又很少,它就非常好用了。例如聊天室服务器。 以下是一个例子,单线程使用一个Selector处理三个Channel

A Thread uses a Selector to handle 3 Channel's

要使用Selector,需要用它注册Channel,然后调用它的select()方法。这个方法将会阻塞直到某个注册的通路有事件就绪。一旦这个方法返回,线程将会处理这些事件。例如新入连接,数据就绪等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券