面试 谈一谈对java io的理解

  1. 总结如下
    • 按照使用的 IO 模型,大致可以分为三类:
      • BIO:JDK1.4 之前的阻塞 IO
      • NIO:JDK1.4 及以后的版本,非阻塞 IO
      • AIO:JDK1.7 之后,又叫 NIO.2,异步 IO
      • IO 总的来说分为两个阶段,第一阶段是等待数据到达内核缓冲区,第二阶段是将数据从内核缓冲区复制到用户缓冲区。
        • 阻塞 IO 是两个阶段都保持阻塞状态。
        • 非阻塞 IO 第一个阶段不阻塞,但是需要轮询来查看第一阶段是否完成,完成以后进行第二阶段,第二阶段也是需要阻塞的。
        • IO 复用使用 select/poll,阻塞在这两个系统调用上,而不是真正的 IO 操作上,这种方式的优势是可以同时监听多个文件描述符。检查文件描述符是否就绪的工作是由 select/poll 系统调用来负责的。Java 的 NIO 组合使用了 IO 复用 + 非阻塞 IO 两种 IO 模型。不过 Linux 版的 JDK 底层使用的系统调用是 epoll,它使用的模型类似与信号驱动式 IO 模型,当 IO 就绪时会受到消息不需要自己去做轮询工作所以,效率相比 select/poll 会好上很多。但是 epoll 的缺点是可移植性较差,是 Linux 平台专有的系统调用,select/poll 就比较通用了。
        • 信号驱动式 IO 在第一阶段完成后发送信号,该阶段不阻塞,不轮询,然后阻塞进行第二阶段。
        • 异步 IO 在两个阶段都完成以后才发送信号,数据是直接可用的。
    • 按照 IO 的对象,可以分为 4 类。分别是:
      1. 基于字节操作的 I/O 接口:InputStream 和 OutputStream
      2. 基于字符操作的 I/O 接口:Writer 和 Reader
      3. 基于磁盘操作的 I/O 接口:File
      4. 基于网络操作的 I/O 接口:Socket

猜你喜欢

转载自blog.csdn.net/u011573697/article/details/79400198
今日推荐