Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java章节编写规范
  • Java基础

  • Java集合

  • Java并发

  • Java IO

    • Java IO概述
    • IO基础

    • 常用IO流

    • 文件与目录操作

    • Java NIO

    • 高级主题

    • 实践与性能优化

    • 面试与设计题

      • Java IO核心面试题
        • 1. 字节流和字符流有什么区别
        • 2. InputStream 的 read 方法返回值是什么意思
        • 3. 为什么需要缓冲流
        • 4. BIO 是什么
        • 5. 什么是 Java 序列化
        • 6. serialVersionUID 有什么作用
        • 7. File 和 Files 有什么区别
        • 8. flush 和 close 有什么区别
        • 9. 为什么不推荐依赖默认字符集
        • 专家答题框架
        • Tips 快问快答
        • 10. 总结
      • Java NIO核心面试题
      • IO场景设计题
    • IO实践速查

  • JVM

目录

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 成本远高于内存访问,如果每次只读写一个字节,会产生大量系统调用。

常见缓冲流:

  • BufferedInputStream
  • BufferedOutputStream
  • BufferedReader
  • BufferedWriter

# 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 演进说清楚取舍。

上次更新: 2026/06/25, 14:19:18
IO常见坑
Java NIO核心面试题

← IO常见坑 Java NIO核心面试题→

Copyright © 2023-2026 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式