【java IO】转换流 + 对象流 + 序列化详解
Java IO 从入门到深入第五篇转换流 对象流 序列化详解面试高频在前几篇中我们已经掌握了File 类字节流字符流缓冲流但还有两个非常关键的问题问题1字符编码如何真正控制我们之前提到FileReader 无法指定编码那如何解决转换流问题2如何把对象写入文件例如User 对象 → 保存到磁盘对象流 序列化本篇重点转换流原理与使用InputStreamReader / OutputStreamWriter对象流 ObjectInputStream / ObjectOutputStreamSerializable 接口transient 关键字serialVersionUID重点常见易错点面试高频问题一、什么是转换流转换流的核心作用在字节流和字符流之间进行转换结构字节流 ←→ 转换流 ←→ 字符流二、为什么需要转换流问题字节流不处理编码 字符流无法指定编码解决转换流 手动指定编码三、InputStreamReader重点作用将字节流 → 转换为字符流使用示例importjava.io.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{InputStreamReaderreadernewInputStreamReader(newFileInputStream(test.txt),UTF-8);intdata;while((datareader.read())!-1){System.out.print((char)data);}reader.close();}}本质字节 → 解码 → 字符四、OutputStreamWriter作用字符 → 转换为字节流写出示例OutputStreamWriterwriternewOutputStreamWriter(newFileOutputStream(test.txt),UTF-8);writer.write(你好Java IO);writer.close();五、最佳实践推荐写法try(BufferedReaderbrnewBufferedReader(newInputStreamReader(newFileInputStream(test.txt),UTF-8))){Stringline;while((linebr.readLine())!null){System.out.println(line);}} 这是企业级标准写法六、什么是对象流对象流的作用将 Java 对象写入文件 / 从文件读取对象核心类ObjectOutputStream ObjectInputStream七、对象序列化概念对象 → 字节流八、Serializable 接口要实现序列化必须classUserimplementsSerializable示例importjava.io.*;classUserimplementsSerializable{Stringname;intage;publicUser(Stringname,intage){this.namename;this.ageage;}}publicclassMain{publicstaticvoidmain(String[]args)throwsException{ObjectOutputStreamoosnewObjectOutputStream(newFileOutputStream(user.dat));UserusernewUser(Tom,18);oos.writeObject(user);oos.close();}}九、反序列化ObjectInputStreamoisnewObjectInputStream(newFileInputStream(user.dat));Useruser(User)ois.readObject();System.out.println(user.name);ois.close();十、transient 关键字作用不参与序列化示例classUserimplementsSerializable{Stringname;transientStringpassword;}结果password 不会被保存十一、serialVersionUID重点作用控制序列化版本示例classUserimplementsSerializable{privatestaticfinallongserialVersionUID1L;}为什么需要问题类结构发生变化例如新增字段 删除字段如果没有 UID反序列化失败异常InvalidClassException十二、序列化本质面试重点对象 → 字节数组 → 文件反序列化文件 → 字节 → 对象十三、使用场景1 数据持久化对象保存到磁盘2 网络传输对象通过 socket 传输3 缓存系统对象序列化存储十四、常见易错点1 没有实现 SerializableNotSerializableException2 忘记 serialVersionUID版本不兼容3 静态变量不会被序列化static 不属于对象4 transient 字段丢失反序列化后为默认值十五、面试高频问题重点1 什么是序列化对象 → 字节流2 为什么需要序列化存储 传输3 transient 作用不序列化字段4 serialVersionUID 有什么用版本控制 防止反序列化失败5 为什么不推荐 Java 原生序列化原因性能低 不安全 不可读 跨语言差十六、总结本篇是 Java IO 的进阶核心内容。转换流InputStreamReader OutputStreamWriter作用控制编码 解决乱码对象流ObjectInputStream ObjectOutputStream作用对象读写序列化核心Serializable transient serialVersionUID