Java NIO学习笔记一(IO VS NIO)

IO简单回忆

Java IO中最为核心的一个概念是流(Steam),面向流的编程。流是信息的载体。IO中的一个流要么是输入流,要么是输出流,不可能同时是输入流和输出流。

NIO概述

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

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

在NIO中,我们是面向缓冲区(Buffer)编程的。其中Channel对应IO的Stream,Selector是因为NIO可以使用异步的非堵塞模式才加入的东西。

Channel 和 Buffer

基本上,所有的 IO 在NIO 中都从一个Channel 开始。数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。所有数据的读写都是通过Buffer进行的,永远不会出现直接向Channel写入数据的情况,或是直接从Channel读取数据的情况。Buffer的这种实现靠自带方法flip()。 这里有个图示:

Java NIO学习笔记一(IO VS NIO)_第1张图片

Channel可以理解为IO中的Stream,与Stream不同的是Channel是双向的,一个流只可能是InputStream或是OutputStream。Channel打开则可以进行读取,写入或读写。由于是Channel是双向的,因此,他能更好地反映出底层操作系统的真实情况;在Linux系统中,底层操作系统的通道就是双向的。

Buffer本身就是一块内存,底层实现上,实际就是一个数组,数组的读写都是通过Buffer来实现的,==Buffer既可以用来读和写,与IO中的Stream不一样。==

Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel
    正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

以下是Java NIO里关键的Buffer实现(7种原生数据类型都有各自对应的Buffer类型):

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

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

Selector

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

这是在一个单线程中使用一个Selector处理3个Channel的图示:

Java NIO学习笔记一(IO VS NIO)_第2张图片

一个线程对应一个Selector,这个Selector对应3个Channel,每一个Channel下面对应一个Buffer。这个线程可以在3个Channel上来回切换,具体某一个时刻线程切换到哪是由事件决定的

你可能感兴趣的:(Java基础)