BIO是同步阻塞IO,是Java传统的IO模型,核心是一个线程处理一个连接,连接空闲时线程也会阻塞等待,资源利用率极低。NIO是同步非阻塞IO,基于通道(Channel)、缓冲区(Buffer)、选择器(Selector) 实现,单线程可以管理成千上万个连接,只有连接有数据读写时才占用资源。 两者区别:BIO面向流、单向传输;NIO面向缓冲区、双向传输。BIO阻塞,NIO非阻塞。BIO适合连接数少、固定的场景;NIO适合高并发、大量短连接的网络编程,比如网关、消息服务器、Web容器等,是目前高性能网络编程的主流选择。
Selector是NIO的多路复用器,是实现高并发的核心组件,作用是用单个线程监控多个Channel的IO事件。工作原理:将多个网络通道注册到选择器上,设置需要监听的事件(连接、读、写),Selector会不断轮询所有注册的Channel。一旦某个Channel有事件触发(比如有数据可读),Selector就会感知到,并将该通道加入就绪集合,线程只需处理这些就绪的通道即可。 这种机制避免了为每个连接创建独立线程,大幅减少线程上下文切换的开销,让单线程能高效管理海量网络连接,是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两种协议实现,两者核心差异很大。TCP是面向连接、可靠、基于字节流的协议,通信前需要三次握手建立连接,保证数据不丢失、不重复、按顺序到达,有流量控制和拥塞控制,适合传输重要数据。UDP是无连接、不可靠、基于数据报的协议,无需建立连接,直接发送数据包,速度快但可能丢包、乱序。 Socket编程中,TCP用ServerSocket/Socket,UDP用DatagramSocket/DatagramPacket。TCP适合聊天、文件传输、支付;UDP适合视频直播、游戏、语音通话等对速度要求高、允许少量丢包的场景。
序列化是将Java对象转换成字节流的过程,方便对象在网络传输、文件存储;反序列化是将字节流还原为Java对象。实现只需实现Serializable接口,JVM会自动完成转换。 但序列化存在严重安全风险:恶意构造的字节流在反序列化时,会执行对象中的代码,导致远程代码执行、注入攻击。比如未做安全校验的类,被传入恶意序列化数据,会触发漏洞。防护方法:禁用不安全的反序列化、重写readObject()做校验、使用白名单限制可序列化的类、优先用JSON/Protobuf等安全格式替代Java原生序列化。
transient是Java的关键字,专门用来修饰成员变量,核心作用是:被修饰的变量在对象序列化时会被忽略,不会写入字节流。当对象进行序列化存储或网络传输时,transient变量会被跳过,反序列化后该变量会恢复为默认值(引用类型为null,基本类型为0/false)。 适用场景:修饰敏感信息(密码、密钥)、临时数据(缓存、计算中间值)、无需持久化的字段,避免敏感数据泄露,减少序列化体积。注意:transient只对Java原生序列化生效,对JSON、Redis等第三方序列化框架无效。
try-with-resources是JDK7推出的语法糖,专门用来自动关闭实现AutoCloseable接口的资源(如流、通道、连接),彻底解决了传统try-catch-finally手动关闭资源的痛点。 优点:代码简洁,无需编写finally块,避免了手动关闭资源时的遗漏;自动处理异常,资源关闭时的异常不会被覆盖,异常信息更完整;线程安全且可靠,无论代码正常执行还是抛出异常,资源都会被自动关闭,杜绝了因资源未释放导致的内存泄漏、文件句柄溢出等问题。它是目前Java中处理IO、数据库连接等资源的最优写法,完全替代了传统的手动关闭方式。