Java BIO/NIO/AIO流

一、IO流

  1. 定义:IO流用来处理设备之间的数据传输,在java程序中,对于数据的输入/输出操作都是以“流”的方式进行;

  2. 分类

    A. 按流的方向分

      输入流:程序从数据源读取数据的流;

      输出流:程序向数据源写出数据的流;

    B. 按流的内容(传输方式)分

      字节流:以字节为单位传输数据的流;

      字符流:以字符为单位传输数据的流;

    C. 按流的操作类型分

      文件流:用于程序和文件之间的数据传输;

      数组流:以字节数组形式传输

      转换流:用于在字节流和字符流之间进行转换

      管道流:

      缓冲流:对读写的数据提供了缓冲的功能,用于提高读写的效率,请注意:对于缓冲输出流,写出的数据会缓存在内存缓存区内,关闭之前要用flush()方法将缓存区的数据强制立即写出,调用close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区。

  3. 字节流(InputStream / OutputStream)

    A. 分类

      文件字节流:FileInputStream、FileOutputStream

      数组字节流:ByteArrayInputStream、ByteArrayOutputStream

      缓冲字节流:BufferedInputStream、BufferedOutputStream

      管道字节流:PipedInputStream、PipedOutputStream

    B. 使用场景:适合对图片、音乐、视频、压缩包等文件的拷贝

  4. 字符流(Reader / Writer)

    A. 分类

      文件字符流:FileReader、FileWriter

      数组字符流:CharArrayReader、CharArrayWriter

      缓冲字符流:BufferedReader、BufferedWriter,其中readLine()方法用于一行行的读取,newLine()方法用于写出一个行分隔符

      管道字符流:PipedReader、PipedWriter

    B. 使用场景:适合对文本文件的读取和拷贝;

  5. 转换流

    A. 分类

      InputStreamReader:将输入的字节流变成字符流;

      OutputStreamWriter:将输出的字符流变成字节流;

  6. 概念组

    A. 阻塞IO和非阻塞IO:属于程序级别的,描述程序请求操作系统IO操作后,如果IO资源没有准备好,对于阻塞体现为等待,对于非阻塞体现为继续执行,即使用线程一直轮询,直到IO资源准备好了;

    B. 同步IO和非同步IO:属于操作系统级别的,描述操作系统在收到程序请求IO操作后,如果IO资源没有准备好,同步体现为不响应,直到IO资源准备好以后,非同步体现为返回一个标记,程序监听,当IO资源准备好之后,再用事件机制返回给程序。

 

二、BIO

  1. 定义:BIO即Blocking IO,属于同步阻塞的IO,传统的IO模型,依赖于ServerSocket实现,即一个请求对应一个线程,该线程完成数据的输入,业务处理和数据的返回,如果线程数不够连接,则会等待空余线程或拒绝连接;

  2. 特点:当并发数很大,就会创建大量的线程,占用很大的系统资源,在线程开销和上下文切换上降低处理性能;当连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源的浪费。

  3. 应用场景:适用于连接数比较少且固定架构的应用。

 

三、NIO

  1. 定义:NIO即Non-Blocking IO,属于同步非阻塞的IO,它是基于时间驱动的,采用了Reactor模式,它使用一个线程管理所有的Socket通道,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才会启动一个线程进行处理;

  2. 使用:建议使用Netty框架,而非jdk自带的api,因为api使用很复杂;

  3. 使用场景:适用于连接数目较大但是连接时间短的应用,如聊天应用。

  4. NIO三大核心组件

    A. Selector(选择器):可以用一个线程处理多个客户端连接,能够检测多个注册的通道上是否有事件发生;

    B. Channel(通道):可以从缓冲读数据,也可以写数据到缓冲;

    C. Buffer(缓冲区):是一个读写数据的内存块,能够跟踪和记录缓冲区的状态变化;

    D. 组件关系

 

四、AIO

  1. 定义:AIO即Asynchronous IO,是NIO 2.0,属于异步非阻塞的IO,采用了Proactor模式,简化了程序编写,一个有效的请求才启动一个线程,先由操作系统完成后才通知服务端程序启动线程去处理;

  2. 应用场景:使用与连接数较多且连接时间长的应用。

 

五、多路复用IO

  1. 定义:多路复用IO即IO Multiplexing,属于异步阻塞IO,采用了Reactor模式,Java中的Selector和Linux中的epoll都是这种模型。

 

可参考:https://wangning1125.iteye.com/blog/1400146

    https://blog.51cto.com/13501268/2063431

    https://liuyanzhao.com/7643.html

posted @ 2019-05-14 19:46  如幻行云  阅读(222)  评论(0编辑  收藏  举报