Java IO

1、Java 中的 IO 流的分类?说出几个你熟悉的实现类?

  1. 按功能来分:输⼊流(input)、输出流(output)。
  2. 按类型来分:字节流 和 字符流。
  3. 字节流:InputStream/OutputStream 是字节流的抽象类,这两个抽象类⼜派生了若干子类,不同的子类分别处理不同的操作类型。

Snipaste_2022-01-05_21-23-00.png

2、字节流和字符流有什么区别?

  1. 字节流按 8 位传输,以字节为单位输⼊输出数据
  2. 字符流按 16 位传输,以字符为单位输⼊输出数据。

但是不管⽂件读写还是网络发送接收,信息的最小存储单元都是字节。

3、字节流如何转为字符流?

  • 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对 象。
  • 字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对 象。

    4、BIO、NIO、AIO 有什么区别?

    BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。 同步阻塞I/O模式,数据的读取写⼊必须阻塞在⼀个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每⼀个连接专注于自己的 I/O 并且编程模型简单,也不⽤过多考虑系统的过载、限流等问题。线程池本身就是⼀个天然的漏斗,可以缓冲⼀些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要⼀种更高效的 I/O 处理模型来应对更高的并发量。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。NIO 是⼀种同步⾮阻塞的 I/O 模型,在 Java1.4 中引⼊了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它⽀持⾯向缓冲的,基于通道的 I/O 操作⽅法。NIO 提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的⽀持⼀样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使⽤同步阻塞 I/O 来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。也就是应⽤操作之后会直接返回,不会堵塞在那⾥,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步 IO 的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。

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

IO操作包括:对硬盘的读写、对socket的读写以及外设的读写。
当用户线程发起一个IO请求操作(本文以读请求操作为例)内核会去查看要读取的数据是否就绪。
对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;
对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。
当数据就绪之后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操作
也就是说一个完整的IO读请求操作包括两个阶段:

  1. 查看数据是否就绪;
  2. 进行数据拷贝(内核将数据拷贝到用户线程)。

那么阻塞(blocking IO)和非阻塞(non-blocking IO)的区别就在于第一个阶段,如果数据没有就绪,
在查看数据是否就绪的过程中是一直等待,还是直接返回一个标志信息。
Java中传统的IO都是阻塞IO,比如通过socket来读数据,调用read()方法之后,如果数据没有就绪,当
前线程就会一直阻塞在read方法调用那里,直到有数据才返回;而如果是非阻塞IO的话,当数据没有就
绪,read()方法应该返回一个标志信息,告知当前线程数据没有就绪,而不是一直在那里等待。
链接:想理解Java的IO,不要从操作系统开始说起的都是耍流氓…