001-Java基础-IO

基本概念

  • 同步与异步。同步是一种可靠的有序运行机制,当我们进行同步操作时,后续任务需要等到当前调用返回,才会进行下一步。而异步则不需要等待当前调用返回,通常依赖事件、回调等机制实现。
  • 阻塞与非阻塞。在进行阻塞操作时,当前线程会一直等待IO操作完成,无法进行其它任务,直到某个条件就绪才继续。非阻塞则是不管IO操作是否完成,直接返回,相应操作在后台继续处理。

BIO

特点

传统的java.io包,基于流模型,同步阻塞模式。

类结构

BIO主要分为Stream和Reader/Writer两大类。

Stream用于操作字节,例如图片。Reader/Writer用于操作字符,例如从文件读取数据。

NIO

特点

基于多路复用的,同步非阻塞的IO模式。

类结构

NIO主要包括Buffer、Channel、Selector三个核心部分。

  • Buffer是数据容器,Channel是数据通道,所有的IO在NIO 中都从一个Channel开始。Channel 有点象流。数据可以从Channel读到Buffer中,也可以从Buffer写到Channel中。

  • Selector是NIO实现多路复用的基础,允许单线程处理多个Channel。

BIO与NIO的区别

以服务端提供接口给客户端调用的场景为例,如果是用BIO实现,需要为每一个客户端请求创建一个线程,如下图所示:

在连接数不多的情况下,这种方式没有太大问题,但是一旦连接数巨量增加(例如高并发的场景),线程上下文切换带来的开销会导致性能出现极大问题。

改进方案就是使用NIO,通过Selector单线程轮询Channel的机制,实现多路复用,避免频繁切换线程带来的问题。

上篇002-数据结构与算法-复杂度分析
下篇001-Java基础-类加载过程