200723 IO v.s. NIO v.s. AIO - 图1

    1. IO
      1. IO 不仅是对文件进行操作,网络编程中的Socket通信也属于IO
      2. 基本的流
        1. 输入、输出字节流:读取写入字节,由于以字节的形式读写,中文文本文件会出现编码的问题
          1. FileInputStream
          2. FileOutputStream
        2. 输入、输出字符流:读取写入字符,由于以字符的形式读写,因此支持中文字符
          1. FileReader
          2. FileWriter
        3. 输入、输出缓冲流:指定缓冲区大小,提高读取或写入的速度;避免了频繁的磁盘读写,进而提高IO的处理效率
          1. BufferedInputStream
          2. BufferedOutputStream
          3. BufferedReader
          4. BufferedWriter
        4. 输入、输出转换流:解决字节流的编码问题,在读写的时候可以指定编码格式
          1. InputStreamReader
          2. OutputStreamWriter
        5. 序列化、反序列化流:将对象以流的方式进行读写
          1. ObjectOutputStream
          2. ObjectInputStream
      3. IO交互方式是同步阻塞的方式,保证了线性顺序。但是在读写没有进行完之前,线程会被阻塞
    2. NIO
      1. NIO解决了同步阻塞的IO包具有的效率问题。可以使用Channel、Selector、Buffer等新特性构造可多路复用的,同步非阻塞的IO程序
      2. 组成部分
        1. Buffer:数据容器,除了boolean其他数据类型都有对应Buffer实现
        2. Channel:较之File或Socket,Channel是一种更加操作系统底层的抽象,使得NIO可以利用现代操作系统底层机制,获得特定场景下的性能优化
        3. Selector:同样基于底层操作系统;可以检测注册在Selector上的多个Channel中的就绪状态,从而高效管理。是NIO实现多路复用的基础
        4. Charset:提供Unicode字符串定义,NIO提供相应的编解码器
      3. 缺点:NIO当现有的IO请求在数据拷贝阶段,会出现资源类型过分庞大而造成线程长期阻塞,从而造成性能瓶颈> NIO 则是利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。
    1. AIO
      1. AIO引入了异步非阻塞的方式。异步IO操作,基于事件和回调机制,应用操作直接返回不会被阻塞。处理完成后,系统通知相应线程进行工作。
      2. ……待补充,暂时看不懂
    2. 补充
      1. 同步 v.s. 异步
        1. 同步和异步关注的是消息通信机制
        2. 同步:发出调用之后该调用返回
        3. 异步:发出该调用后,调用直接返回而没有调用结果;而是通过回调、状态、通知等其他方式返回结果,实现任务间的次序关系;
      2. 阻塞 v.s. 非阻塞
        1. 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
        2. 阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回
        3. 非阻塞:即使没有获得调用结果,该调用不会阻塞当前线程
    3. try-with-resource 语法

      1. 外部资源的句柄对象实现了AutoCloseable接口时,可以用以下模板简化书写java public static void main(String[] args) { try (FileInputStream inputStream = new FileInputStream(new File("test"))) { System.out.println(inputStream.read()); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } }

      2. 将外部资源的句柄对象放在try关键字后面的括号中,当try-catch代码块执行完毕之后,java会确保外部资源的close方法被调用

      3. 常用的java.io.InputStream,java.io.OutputStream,java.io.Reader,java.io.Writer(以及其各自的子类)都实现了AutoCloseable接口