Java IO 详解:从BIO到NIO

0 下载量 54 浏览量 更新于2024-08-03 收藏 53KB MD 举报
Java IO 体系是Java平台中用于输入输出操作的基础框架,涵盖了从简单的文件读写到复杂的网络通信等多种场景。本文将逐步解析Java IO的核心概念,并深入探讨两种主要的IO模型:传统的 Blocking I/O (BIO) 和 New I/O (NIO)。 ### 1. 传统的BIO BIO,即阻塞I/O,是最基本的I/O模型。在BIO中,当进行读写操作时,如果数据没有准备好,线程会被阻塞,直到数据准备就绪。这种模型适用于并发连接数量较小的应用,但在高并发场景下,由于每个连接都需要一个单独的线程处理,资源消耗较大。 ### 2. BIO NIO 和 AIO 的区别 - **BIO**:面向流,阻塞模式,适合连接数少且固定的场景。 - **NIO**:非阻塞I/O,引入了缓冲区和通道的概念,允许单线程处理多个连接,适合高并发场景。 - **AIO**(Async I/O,也称为NIO 2):异步非阻塞I/O,操作系统负责通知应用程序何时完成I/O操作,进一步降低了CPU等待时间。 ### 3. 什么是流 流是Java IO中的核心概念,它是数据传输的载体,可以代表数据的输入或输出。流按照流向分为输入流和输出流,按照数据类型分为字节流和字符流。 ### 4. 流的分类 - **字节流**:处理的是8位字节的数据,如InputStream和OutputStream家族。 - **字符流**:处理的是16位Unicode字符,如Reader和Writer家族。 ### 5. 节点流和处理流 - **节点流**:直接作用于数据源或目标,如FileInputStream和FileOutputStream是文件节点流。 - **处理流**:不直接与数据源或目标关联,而是包装在其他流之上,提供额外的功能,如BufferedInputStream和BufferedReader。 ### 6. Java IO的核心类 File `File`类是Java访问文件和目录的接口,它可以用来创建、删除、重命名文件和目录,以及获取文件的基本属性。 ### 7. Java IO 流对象 - **InputStream/OutputStream**:字节流的抽象基类,分别处理输入和输出。 - **Reader/Writer**:字符流的抽象基类,同样处理输入和输出。 ### 8. 字节流与字符流的转换 Java提供了`InputStreamReader`和`OutputStreamWriter`,它们作为桥梁,将字节流转换为字符流,以便处理文本数据。 ### 9. 新潮的 NIO NIO引入了缓冲区(Buffer)、通道(Channel)和选择器(Selector)等概念,提高了I/O性能。 - **缓冲区(Buffer)**:用于临时存储数据,可以更高效地读写数据。 - **通道(Channel)**:连接到I/O设备的接口,可以从或向通道读写数据。 - **示例:文件拷贝案例**:使用通道可以实现高效的文件复制,避免了不必要的数据拷贝。 - **BIO和NIO拷贝文件的区别**:NIO通过通道直接在文件系统之间传输数据,减少了内存拷贝,提高了效率。 - **操作系统的零拷贝**:通过系统调用(如sendfile)实现数据在内核空间之间的直接转移,进一步优化性能。 ### 10. 选择器(Selectors) 选择器用于监控多个通道的事件,允许单线程管理多个并发连接。 - **选择键(SelectionKey)**:表示通道与选择器之间的注册关系,记录了通道可进行的操作。 ### 11. 示例:简易的客户端服务器通信 使用NIO的选择器可以实现简单的服务器端,监听多个客户端连接,实现并发服务。 ### 12. 总结 Java IO 体系复杂但强大,从BIO到NIO,从基础的流操作到高级的零拷贝技术,Java提供了丰富的工具来应对各种I/O需求。理解这些概念和机制,对于编写高效、可靠的I/O代码至关重要。通过不断实践和深入学习,可以更好地掌握Java IO的精髓。