在 Java 开发中,文件读写、数据传输、网络交互等场景都离不开IO 流。IO 流是内存与外部设备之间数据传输的通道,也是后端开发、面试的核心知识点。本文结合分类规则、字节流、字符流、编码、序列化及 File 类等内容,系统梳理 Java IO 体系,帮助大家吃透基础、落地实战。

Java IO 相关类全部位于shturl.包下,首先明确流的三大分类标准,这也是面试高频考点。以 JVM 内存为参照,按传输方向可分为输入流(读数据到内存)和输出流(写数据到外部设备);按传输单位分为字节流和字符流,字节流以字节为单位,支持所有文件类型,字符流专为文本文件设计;按功能又分为节点流和过滤流,节点流负责基础读写,过滤流在其之上增强功能、提升效率。

字节流是 IO 体系的根基,顶层抽象父类为InputStream(字节输入流)和OutputStream(字节输出流)。日常开发最常用的是文件字节流FileInputStreamFileOutputStream。创建流对象时支持绝对路径和相对路径,输出流可通过参数设置覆盖 / 追加文件内容,而输入流找不到文件会直接抛出异常。字节流提供了单次读写单个字节、字节数组等多种方法,利用数组批量读写也是实现文件拷贝的核心思路。

为提升读写效率,Java 提供了字节缓冲流BufferedInputStreamBufferedOutputStream,依靠缓冲区减少磁盘 IO 次数。这里要区分flush()close()flush()刷新缓冲区、流可继续使用;close()会先刷新缓冲区再关闭流,流将无法复用。除此之外,字节流还有两类常用过滤流:Data系列流可读写八大基本数据类型;Object系列流用于对象序列化,这是重中之重。

对象序列化指将对象通过流传输,要求实体类必须实现Serializable标记接口。被transient修饰的成员变量不会参与序列化,若对象包含自定义类型属性,该属性类也需要实现序列化接口,否则会抛出NotSerializableException。读取对象到文件末尾时,会触发EOFException异常。

文本文件优先使用字符流,其顶层抽象父类是ReaderWriter,核心实现类为FileReaderFileWriter。字符流天然适配文本,还支持直接读写字符串,使用更便捷。字符过滤流里,BufferedReaderreadLine()方法可按行读取文本,处理日志、配置文件十分高效;PrintWriter则提供printprintln方法,支持自动换行。

很多场景需要手动指定编码格式,这时就要用到桥转换流InputStreamReaderOutputStreamWriter,它是字节流与字符流的转换桥梁,能统一编解码规则,从根源解决中文乱码问题。切记:编码和解码格式必须保持一致,否则一定会出现乱码。

编码也是 IO 的基础知识点,常见编码有 ISO8859-1、GBK、UTF-8 等。UTF-8 作为通用编码,字符占用 1~3 个字节,目前项目中基本统一使用该编码。

很多初学者会混淆File类和 IO 流:IO 流操作文件内容,File 类操作文件本身。File 类可以创建、删除文件 / 文件夹,获取文件名称、绝对路径,结合递归还能遍历多级目录、筛选指定后缀文件,是文件管理的核心工具。

最后做个总结:处理图片、视频、压缩包等非文本文件,一律使用字节流;处理.txt.java等文本文件,优先使用字符流;追求读写效率搭配缓冲流;需要序列化对象使用Object流;指定编码格式则借助桥转流。同时使用 IO 流必须手动调用close()关闭资源,避免内存泄漏。

Java IO 流体系庞大但逻辑清晰,理清分类、区分使用场景、掌握序列化与乱码解决方案,就能轻松应对开发需求与面试提问。

更多推荐