文章

Java IO

Java IO

IO

IO 基础

什么是 IO?

程序内部(内存)和外部(本地文件或网络)进行数据交互的过程,就叫输入输出;从外部读取数据到内部,叫做输入,从内部写数据到外部叫输出。

BIO

NIO

IO 和 NIO 使用场景

NIO 是为弥补传统 IO 的不足而诞生的,但是尺有所短寸有所长,NIO 也有缺点,因为 NIO 是面向缓冲区的操作,每一次的数据处理都是对缓冲区进行的,那么就会有一个问题,在数据处理之前必须要判断缓冲区的数据是否完整或者已经读取完毕,如果没有,假设数据只读取了一部分,那么对不完整的数据处理没有任何意义。所以每次数据处理之前都要检测缓冲区数据。
那么 NIO 和 IO 各适用的场景是什么呢?
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,这时候用 NIO 处理数据可能是个很好的选择。
而如果只有少量的连接,而这些连接每次要发送大量的数据,这时候传统的 IO 更合适。使用哪种处理数据,需要在数据的响应等待时间和检查缓冲区数据的时间上作比较来权衡选择。

面试题

说说你理解的 IO?NIO 是什么? AIO?

BIO:线程发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。
NIO:线程发起 IO 请求,立即返回;内核在做好 IO 操作的准备之后,通过调用注册的回调函数通知线程做 IO 操作,线程开始阻塞,直到操作完成。
AIO:线程发起 IO 请求,立即返回;内存做好 IO 操作的准备之后,做 IO 操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做 IO 操作完成或者失败。

什么是阻塞 IO?什么是非阻塞 IO?

Ref

看一遍就理解:IO模型详解
用轻和快定义优雅,Okio框架解析
Linux IO模式及 select、poll、epoll详解

本文由作者按照 CC BY 4.0 进行授权