Java IO核心知识提问点
什么是 IO?
答案:IO 即输入输出(Input/Output),是指数据在内存与外部设备之间的传输,比如程序从文件中读取数据到内存,或者将内存中的数据写入到文件、网络等外部设备中。在 Java 类库中,IO 部分涉及标准输入输出、文件操作、网络数据传输流等多个领域。Java 中的 IO 模型有哪些?
答案:Java 中的 IO 模型主要有 BIO(Blocking IO,阻塞 IO)、NIO(Non - blocking IO,非阻塞 IO)和 AIO(Asynchronous IO,异步 IO)。BIO 是同步阻塞的,服务器实现一个连接一个线程;NIO 是同步非阻塞的,通过多路复用器轮询连接的 IO 请求;AIO 是异步非阻塞的,由操作系统先完成 IO 操作再通知服务器应用。字节流与字符流的区别?分别有哪些核心类?
答案:字节流以字节(8 位)为单位处理数据,适用于所有类型文件,核心类有 InputStream/OutputStream、FileInputStream/FileOutputStream 等;字符流以字符(16 位 Unicode)为单位处理数据,适用于文本文件,核心类有 Reader/Writer、FileReader/FileWriter 等。字节流直接操作字节,字符流通过字符编码转换字节,需注意编码不一致导致的乱码问题。BIO 和 NIO 的本质区别是什么?
答案:BIO 是面向流的,读写操作阻塞线程,一个连接对应一个线程,在高并发下容易导致资源耗尽;NIO 是面向缓冲区的,支持非阻塞操作,通过 Selector 实现 “一个线程管理多个连接”,更适合高并发场景。NIO 的三大核心组件是什么?各自的作用?
答案:NIO 的三大核心组件是 Buffer(缓冲区)、Channel(通道)和 Selector(选择器)。Buffer 用于存储读写的数据,是数据容器;Channel 是双向数据通道,可读写数据并关联缓冲区;Selector 是多路复用器,一个线程可监控多个 Channel 的事件,实现非阻塞 IO 管理。什么是同步 IO 和异步 IO?请简述它们的区别。
答案:同步 IO 中,一个 IO 操作必须在完成之前,其他所有操作都必须等待,会阻止程序的执行;异步 IO 中,一个 IO 操作的开始和结束是分离的,程序在 IO 操作开始后可以继续执行其他操作,当 IO 操作完成时会收到通知。区别在于同步 IO 操作会阻塞程序执行,而异步 IO 操作允许程序在 IO 操作完成之前继续执行其他任务。在 Java 中如何实现异步 IO 操作?
答案:在 Java 中,异步 IO 主要通过 NIO 库实现,尤其是 NIO.2。可以使用 java.nio.channels 包中的 AsynchronousFileChannel 类进行异步文件 IO 操作,或者对于网络操作使用 AsynchronousSocketChannel 和 AsynchronousServerSocketChannel 类。可以通过 Future 对象检查操作是否完成,也可以通过实现 CompletionHandler 接口以回调的方式在操作完成时异步地得到通知。Buffer 的 flip ()、rewind ()、clear () 方法的区别?
答案:flip () 方法用于切换为读模式,会将 limit 设置为当前 position,position 设置为 0;rewind () 方法用于重置读指针,将 position 设置为 0,limit 不变;clear () 方法用于清空缓冲区,将 position 设置为 0,limit 设置为 capacity,但数据并未真正删除,后续写入会覆盖原有数据。