Java IO流主要可以从两个维度进行分类:

1. 按流向分:

  • 输入流:从数据源(如文件、网络等)读取数据到程序。

  • 输出流:从程序写出数据到目的地(如文件、网络等)。

2. 按处理数据单位分:

  • 字节流:以字节(8位)为单位进行读写,可以处理所有类型的数据。

    • 字节输入流:InputStream 为基类,常用子类有 FileInputStreamBufferedInputStream 等。

    • 字节输出流:OutputStream 为基类,常用子类有 FileOutputStreamBufferedOutputStream 等。

  • 字符流:以字符(16位)为单位进行读写,主要用于处理文本数据。

    • 字符输入流:Reader 为基类,常用子类有 FileReaderBufferedReader 等。

    • 字符输出流:Writer 为基类,常用子类有 FileWriterBufferedWriter 等。

3. 按功能分:

  • 节点流:直接从数据源或目的地读写数据,如 FileInputStreamFileReader

  • 处理流(包装流):对节点流进行包装,提供更强大的读写功能,如 BufferedInputStreamBufferedReader 提供缓冲功能,InputStreamReader 和 OutputStreamWriter 实现字节流与字符流的转换。

BIO、NIO、AIO的区别

BIO、NIO、AIO是Java中用于处理I/O操作的三种模型,它们在不同版本的Java中被引入。

1. BIO (Blocking I/O) 同步阻塞I/O

  • 特点:在进行I/O操作时,线程会一直阻塞,直到读写完成。每个连接都需要一个独立的线程处理。

  • 工作模式:服务器为每个客户端连接创建一个线程,线程在读取或写入数据时会被阻塞。

  • 优缺点

    • 优点:编程简单,在连接数少的情况下性能不错。

    • 缺点:每个连接都需要一个线程,线程开销大,不适合高并发场景。

  • 应用场景:连接数较少且固定的架构。

2. NIO (Non-blocking I/O 或 New I/O) 同步非阻塞I/O

  • 特点:线程在发起I/O操作后可以立即返回,不需要阻塞等待,通过选择器(Selector)机制实现一个线程处理多个通道(Channel)。

  • 核心组件

    • Channel:类似于流,但可以同时进行读写,支持非阻塞模式。

    • Buffer:数据缓冲区, Channel读写数据必须经过Buffer。

    • Selector:一个选择器可以监控多个Channel的事件(如连接就绪、读就绪、写就绪)。

  • 工作模式:线程通过Selector轮询多个Channel,当某个Channel有事件就绪时,线程才进行I/O操作。

  • 优缺点

    • 优点:一个线程可以处理多个连接,适合高并发场景。

    • 缺点:编程模型复杂,需要理解Buffer、Channel、Selector等概念。

  • 应用场景:连接数多且连接时间短的架构,如聊天服务器、网络游戏服务器等。

3. AIO (Asynchronous I/O) 异步非阻塞I/O

  • 特点:应用程序发起I/O操作后立即返回,当I/O操作完成时,系统会回调通知应用程序。整个过程不会阻塞线程。

  • 工作模式:基于事件和回调机制,由操作系统完成I/O操作后通知应用程序。

  • 优缺点

    • 优点:不会阻塞线程,适合高并发且连接时间长的场景。

    • 缺点:编程模型复杂,需要回调函数,目前应用不是很广泛。

  • 应用场景:连接数多且连接时间长的架构,如相册服务器、文件服务器等。

三者的对比表格

特性 BIO NIO AIO
阻塞方式 阻塞 非阻塞 非阻塞
同步/异步 同步 同步 异步
编程难度 简单 复杂 复杂
可靠性
吞吐量
适用场景 连接数少,低并发 连接数多,短连接 连接数多,长连接

补充说明:

  • 同步与异步:指的是应用程序与内核的交互方式。同步是指应用程序主动等待I/O操作完成;异步是指应用程序发起I/O操作后继续执行,由内核通知应用程序I/O操作完成。

  • 阻塞与非阻塞:指的是线程在等待I/O操作时的状态。阻塞是指线程一直等待直到I/O操作完成;非阻塞是指线程在等待I/O操作时可以执行其他任务。

总结

        Java IO流按不同维度分为字节流/字符流、输入流/输出流、节点流/处理流。而BIO、NIO、AIO是Java中处理I/O的三种模型,它们分别适用于不同的场景。随着高并发网络应用的发展,NIO和AIO的使用越来越广泛,尤其是在需要处理大量并发连接的服务器端编程中。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐