IO面试题
1、Java中的IO流分为几种
- 按照流的流向分,可以分为输入流和输出流;
- 按照操作单元划分,可以划分为字节流和字符流;
Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派⽣出来的。
- InputStream/Reader: 所有的输⼊流的基类,前者是字节输⼊流,后者是字符输⼊流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2、既然已经有了字节流,为什么还要有字符流
字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了⼀个直接操作字符的接口,方便我们平时对字符进行操作。如音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。 比如:文本文件,目前文本文件只能用字符流来进行操作,字节流被称为万能流。
3、BIO、NIO、AIO的区别
- BIO (Blocking I/O): 同步阻塞 I/O 模式,最垃圾的一种IO模型,数据的读取写入必须阻塞在⼀个线程内等待其完成。【读写都挤在一个线程里,能读的时候,不能写,能写的时候不能读,可以启动多个线程,让每个线程干不同的事,比如一个线程专门读,另一个线程专门写】在活动连接数不是特别高(小于单机 1000)的情况下,这种模型是比较不错的,可以让每⼀个连接专注于自己的 I/O 并且编程模型简单,也不⽤过多考虑系统的过载、限流等问题。线程池本身就是⼀个天然的漏⽃,可以缓冲⼀些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是⽆能为力的。因此,我们需要⼀种更高效的 I/O 处理模型来应对更⾼的并发量。
- NIO (Non-blocking/New I/O): NIO 是⼀种同步非阻塞的 I/O 模型, 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上epoll,多路复用器轮询到连接有 I/O 请求就进行处理。“看哪个人还没有工作 ,就把这个IO请求扔给该人”
- AIO (Asynchronous I/O): 异步非阻塞的 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是应⽤操作之后会直接返回,不会堵塞在那⾥,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步 IO 的缩写,主要使用于Windows系统。
AIO模型只有Windows支持,Linux不支持
Linux只支持NIO
Netty封装的是NIO