Java NIO 预览

41 阅读2分钟

1、Java NIO Channel

Java NIO由接下来的这几个核心组件构成:

  • Channels
  • Buffers
  • Selectors

Java NIO 有更多的类和组件远不止这些,但是在我看来Channel,Buffer和Selector构成了API的核心。其它的组件就像Pipe和FileLock仅仅是一些工具类和这三个核心组件一起使用。因此我将聚焦在这三个组件在这个NIO预览里。其它的组件在这个教程里它们自己的相关描述里。可以查看目录获取更多信息。

Channels and Buffers

典型的,NIO里所有的IO从Channel开始。Channel有点像流。从Channel数据可以读到Buffer。数据也可以从Buffer写到Channel。这里是一个插图:

Java NIO: Channel读取数据到Buffer和Buffer写数据到Channels。

Channel Implementatios

Java NIO channels非常类似于流同时又有点不同:

· 你可以读和写到一个channel。流通常是单向的(读或者写)。

· channel可以异步读写。

· channel通常读到Buffer或者从Buffer写。

如同上面提起的,你可以从channel读取数据到buffer,从buffer将数据写到channel。这是上面描述的图表

Java NIO: channel读取数据到Buffers,Buffer写数据到Channels。

有几种Channel和Buffer类型。这里是在Java NIO里主要的Channel实现列表:

    • FileChannel
    • DatagramChannel
    • SocketChannel
    • ServerSocketChannel

如同你看到的,这些channels覆盖了UDP + TCP 网络IO和文件IO。

随着这些类有一些很有趣的接口,但是为了简单我把这些放在了Java NIO预览之外。它们将会在相关的地方解释,在Java NIO教程的其他内容里。

这里是在Java NIO里实现的核心Buffer列表

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

这些Buffer覆盖了你可以通过IO发送的基本数据类型:byte, short, int, long, float, double 和 characters。

Java NIO也有一个MappedByteBuffer ,和内存映射文件一起使用。我将把Buffer放在这个预览外面。

Selectors

一个Selector允许一个线程处理多个channels。这是很方便的,如果你的应用有很多连接(Channels)打开,但是每个连接都只有少量的任务。比如说在一个聊天服务器。

这里是一个线程用一个Selector去处理3个Channels的插图:

Java NIO: 一个线程使用一个Selector去处理3个channels。

为了使用Selector你注册Channel到它里面。然后调用select()方法。这个方法将阻塞直到注册的channels中有事件已经就绪。一旦方法返回,线程可以处理这些线程。事件的例子如incoming connection, data received等等