Java NIO(二)API基本概述

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

  • Channel
  • Buffer
  • Selector

Channel(通道)可以理解为对IO操作的优化,传统IO基于流操作,读只能用输入流,写只能用输出流。流都是单向的,而通道是双向的,既可以基于通道进行写,也可以进行读。Channel的几个实现类:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

Buffer(缓冲区)可以理解为利用通道进行读写数据时的容器,通道内是不能直接存入数据的,只能接受Buffer。Buffer的实现类:这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。

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

Buffer还有一个实现类MappedByteBuffer,是利用内存文件映射读写文件时用到的,在上一篇文章结尾的例子中有用到。

Selector(选择器)可以实现单线程操作多个通道,更像是一个监听器,不断的轮训每个通道,根据每个通道里面注册的不同的事件,进行不同的操作。选择器的事件:

  • SelectionKey.OP_CONNECT //连接
  • SelectionKey.OP_ACCEPT //接受连接
  • SelectionKey.OP_READ //读事件
  • SelectionKey.OP_WRITE //写事件

举个例子,就像一个大饭店坐满了人,但是只有一个服务员,服务员需要不停的来回走动,发现有那一桌客人需要被服务,就立即处理。服务员来回走动的过程就是Selector不断轮寻的过程,只有一个服务员相当于单线程,饭店里的每一桌相当于一个通道。

由此可知:Selector适合每个通道的数据量都不是很大时使用,否则就会出现一个通道一直在等待被处理的情况,而且并不适用于高并发,会使程序直接崩掉。

下图来自互联网:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xyh930929/article/details/80902660
今日推荐