Java IO核心面试题
这一节整理 Java IO 高频面试题。回答时不要只背 API,要尽量从使用场景、设计思想和生产注意点展开。
# 1. 字节流和字符流有什么区别
字节流以字节为单位,顶层抽象是 InputStream 和 OutputStream,适合处理二进制数据,如图片、视频、压缩包、网络协议。
字符流以字符为单位,顶层抽象是 Reader 和 Writer,适合处理文本数据。字符流会涉及字符集编码和解码。
核心判断标准:如果数据是文本,优先字符流;如果是二进制,必须字节流。
# 2. InputStream 的 read 方法返回值是什么意思
read() 返回读取到的字节值,返回 -1 表示流结束。
read(byte[] buffer) 返回本次读取的字节数,返回 -1 表示流结束,返回值可能小于 buffer 长度。
写出时必须使用真实长度:
output.write(buffer, 0, len);
# 3. 为什么需要缓冲流
缓冲流通过内存缓冲区减少底层 IO 次数。磁盘和网络 IO 成本远高于内存访问,如果每次只读写一个字节,会产生大量系统调用。
常见缓冲流:
BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
# 4. BIO 是什么
BIO 是同步阻塞 IO。线程发起 IO 操作后,如果数据没有准备好,线程会阻塞等待。
典型服务端模型是一个连接一个线程。优点是简单,缺点是连接数大时线程资源消耗严重。
# 5. 什么是 Java 序列化
序列化是把 Java 对象转换为字节序列,反序列化是从字节序列恢复对象。类需要实现 Serializable 接口。
需要注意:
- 建议显式声明
serialVersionUID。 transient字段不会被序列化。- 对象图中的成员也需要可序列化。
- 不要反序列化不可信数据。
# 6. serialVersionUID 有什么作用
serialVersionUID 用于标识类的序列化版本。反序列化时,如果字节流中的版本号和当前类版本不一致,会抛出 InvalidClassException。
显式声明可以减少类结构变化带来的不可控兼容问题。
# 7. File 和 Files 有什么区别
File 是 Java 早期 API,既表示文件也表示目录,但很多方法失败时只返回 boolean。
Files 和 Path 是 NIO.2 API,功能更强,异常更明确,支持文件属性、遍历、复制、移动、符号链接等更现代的文件操作。
新项目优先使用 Path 和 Files。
# 8. flush 和 close 有什么区别
flush() 把缓冲区中的数据刷新到底层目标,但不关闭资源。
close() 会关闭资源,通常会先刷新缓冲区。
需要持续使用流但希望对端立刻收到数据时,调用 flush()。使用完资源后必须 close()。
# 9. 为什么不推荐依赖默认字符集
默认字符集可能受 JDK 版本、操作系统和运行环境影响。虽然 Java 18 起默认字符集统一为 UTF-8,但生产代码显式指定字符集更清晰、更稳妥。
推荐:
StandardCharsets.UTF_8
# 专家答题框架
| 题型 | 回答主线 | 加分点 |
|---|---|---|
| 流体系 | 方向 + 数据单位 + 装饰器 | 节点流/处理流 |
| 文件读写 | Files + 缓冲 + Charset | 大文件和资源关闭 |
| 序列化 | 对象到字节 | 安全和替代方案 |
| 性能优化 | 先测量再优化 | 零拷贝、mmap、线程池隔离 |
| 线上问题 | 保存现场再定位 | 句柄、编码、权限、磁盘满 |
面试回答结构:
先定义概念
▼
讲适用场景
▼
讲底层机制
▼
讲常见坑
▼
给生产建议
# Tips 快问快答
Q:Java IO 核心分类是什么? A:按方向分输入/输出,按单位分字节/字符。
Q:节点流和处理流区别是什么? A:节点流连接真实资源,处理流包装其他流增强能力。
Q:为什么 IO 用装饰器模式? A:可以通过组合灵活叠加缓冲、转换、对象读写等能力。
Q:File 和 Path 怎么比较?
A:File 是早期路径和文件操作混合 API,Path/Files 更现代。
Q:大文件怎么读? A:流式分块或按行处理,不一次性读入内存。
Q:乱码怎么排查? A:沿数据源编码、程序解码、传输编码、输出编码逐段确认。
Q:原生序列化为什么危险? A:有反序列化安全、兼容性、性能和跨语言问题。
Q:IO 面试怎么答出资深感? A:不要只背 API,要主动讲资源关闭、异常、性能、安全和失败恢复。
# 10. 总结
Java IO 面试的核心不是背类名,而是能围绕数据单位、方向、缓冲、编码、资源关闭、序列化安全和文件 API 演进说清楚取舍。