源本科技 | 码上会

企业社招真题 Java IO

2026/04/05
1
0

Java NIO 与 BIO(传统IO)的主要区别及应用场景

BIO 是同步阻塞 IO,是 Java 传统的 IO 模型,核心是一个线程处理一个连接,连接空闲时线程也会阻塞等待,资源利用率极低。NIO 是同步非阻塞 IO,基于通道 (Channel)、缓冲区 (Buffer)、选择器 (Selector) 实现,单线程可以管理成千上万个连接,只有连接有数据读写时才占用资源。 两者区别:BIO 面向流、单向传输;NIO 面向缓冲区、双向传输。BIO 阻塞,NIO 非阻塞。BIO 适合连接数少、固定的场景;NIO 适合高并发、大量短连接的网络编程,比如网关、消息服务器、Web 容器等,是目前高性能网络编程的主流选择。

Java NIO 中 Selector 机制原理

Selector 是 NIO 的多路复用器,是实现高并发的核心组件,作用是用单个线程监控多个 Channel 的 IO 事件。工作原理:将多个网络通道注册到选择器上,设置需要监听的事件(连接、读、写),Selector 会不断轮询所有注册的 Channel。一旦某个 Channel 有事件触发(比如有数据可读),Selector 就会感知到,并将该通道加入就绪集合,线程只需处理这些就绪的通道即可。 这种机制避免了为每个连接创建独立线程,大幅减少线程上下文切换的开销,让单线程能高效管理海量网络连接,是 NIO 高并发的关键。

Channel 在 Java NIO 中的作用

Channel 是 NIO 的核心组件,相当于IO 传输的通道,替代了传统 IO 的流。它最大的特点是双向传输,既可以读数据,也可以写数据,而 BIO 的流是单向的。Channel 不直接操作数据,所有读写都通过Buffer 缓冲区完成,实现数据的高效传输。 NIO 提供了多种通道:FileChannel 处理文件 IO,SocketChannel/ServerSocketChannel 处理 TCP 网络通信,DatagramChannel 处理 UDP 通信。Channel 支持非阻塞模式,还能结合 Selector 实现多路复用,同时支持直接内存、内存映射等高效操作,是 NIO 高性能的基础。

内存映射文件的应用场景

内存映射文件是 NIO 的高级特性,通过 FileChannel 将文件直接映射到操作系统的物理内存,让程序可以像操作内存一样直接读写文件,跳过了内核缓冲区到用户缓冲区的拷贝,速度极快。 适用场景:大文件的随机读写,比如日志文件、数据库文件、视频文件处理;进程间共享数据,多个进程可以映射同一个文件实现内存共享通信;需要高性能 IO 的场景,比如消息队列的持久化存储。不适合小文件频繁读写,因为映射内存本身有开销。它是 Java 中处理超大文件最高效的方式之一。

Socket 编程与 TCP/UDP 区别

Socket 是网络编程的接口,基于传输层的TCP 和 UDP两种协议实现,两者核心差异很大。TCP 是面向连接、可靠、基于字节流的协议,通信前需要三次握手建立连接,保证数据不丢失、不重复、按顺序到达,有流量控制和拥塞控制,适合传输重要数据。UDP 是无连接、不可靠、基于数据报的协议,无需建立连接,直接发送数据包,速度快但可能丢包、乱序。 Socket 编程中,TCP 用 ServerSocket/Socket,UDP 用 DatagramSocket/DatagramPacket。TCP 适合聊天、文件传输、支付;UDP 适合视频直播、游戏、语音通话等对速度要求高、允许少量丢包的场景。

序列化与反序列化机制及安全性

序列化是将 Java 对象转换成字节流的过程,方便对象在网络传输、文件存储;反序列化是将字节流还原为 Java 对象。实现只需实现 Serializable 接口,JVM 会自动完成转换。 但序列化存在严重安全风险:恶意构造的字节流在反序列化时,会执行对象中的代码,导致远程代码执行、注入攻击。比如未做安全校验的类,被传入恶意序列化数据,会触发漏洞。防护方法:禁用不安全的反序列化、重写 readObject() 做校验、使用白名单限制可序列化的类、优先用 JSON/Protobuf 等安全格式替代 Java 原生序列化。

transient 关键字的作用

transient 是 Java 的关键字,专门用来修饰成员变量,核心作用是:被修饰的变量在对象序列化时会被忽略,不会写入字节流。当对象进行序列化存储或网络传输时,transient 变量会被跳过,反序列化后该变量会恢复为默认值(引用类型为 null,基本类型为 0/false)。 适用场景:修饰敏感信息(密码、密钥)、临时数据(缓存、计算中间值)、无需持久化的字段,避免敏感数据泄露,减少序列化体积。注意:transient 只对 Java 原生序列化生效,对 JSON、Redis 等第三方序列化框架无效。

try-with-resources 的优点

try-with-resources 是 JDK7 推出的语法糖,专门用来自动关闭实现 AutoCloseable 接口的资源(如流、通道、连接),彻底解决了传统 try-catch-finally 手动关闭资源的痛点。 优点:代码简洁,无需编写 finally 块,避免了手动关闭资源时的遗漏;自动处理异常,资源关闭时的异常不会被覆盖,异常信息更完整;线程安全且可靠,无论代码正常执行还是抛出异常,资源都会被自动关闭,杜绝了因资源未释放导致的内存泄漏、文件句柄溢出等问题。它是目前 Java 中处理 IO、数据库连接等资源的最优写法,完全替代了传统的手动关闭方式。