面试题答案
一键面试缓冲区的使用
- 传统IO流:传统IO流没有直接使用缓冲区概念,而是通过内置缓冲实现。例如
BufferedInputStream
,它在流的基础上添加了缓冲功能,用户不能直接操作缓冲区,缓冲的管理由流内部实现。数据的读取和写入是基于字节或字符逐个处理,对于大量数据操作效率相对较低。 - NIO Channel:NIO Channel 与缓冲区紧密结合,数据的读写都要通过缓冲区。用户需要手动管理缓冲区,如分配空间、控制读写位置等。ByteBuffer、CharBuffer 等多种类型缓冲区可供选择,能更灵活地处理不同类型数据,例如通过
ByteBuffer.wrap
方法将字节数组包装成缓冲区进行操作。
读写操作的特点
- 传统IO流:读写操作是阻塞式的。当进行读操作时,线程会一直阻塞直到有数据可读;写操作时,线程会阻塞直到数据完全写入。这种方式对于高并发场景不太友好,会造成线程资源的浪费,因为一个线程在等待IO操作完成时不能做其他事情。
- NIO Channel:NIO Channel支持非阻塞式读写。通过
Selector
多路复用器,一个线程可以管理多个Channel,在没有数据可读或可写时,线程不会阻塞,而是可以去处理其他任务。例如在服务端应用中,可以用一个线程处理多个客户端的连接,提高了系统的并发处理能力。同时,NIO的读写操作更加灵活,可以在同一线程内交替进行读和写操作,而传统IO流在同一线程中进行复杂的读写交替逻辑相对复杂。