博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.49 ObjectOutputStream.PutField
ObjectOutputStream.PutField
是一个内部类,用于写入对象字段的值。它通常与 writeFields()
方法一起使用,用于将对象的字段值写入输出流。
ObjectOutputStream.PutField 类介绍:
所有字段:
-
没有公共字段。
构造方法:
-
protected PutField()
:构造一个新的PutField
对象。
方法摘要:
-
void put(String name, boolean value)
:将指定的布尔值写入字段。 -
void put(String name, byte value)
:将指定的字节值写入字段。 -
void put(String name, char value)
:将指定的字符值写入字段。 -
void put(String name, short value)
:将指定的短整型值写入字段。 -
void put(String name, int value)
:将指定的整型值写入字段。 -
void put(String name, long value)
:将指定的长整型值写入字段。 -
void put(String name, float value)
:将指定的浮点值写入字段。 -
void put(String name, double value)
:将指定的双精度浮点值写入字段。 -
void put(String name, Object value)
:将指定的对象值写入字段。 -
void write(ObjectOutput out)
:将字段值写入指定的 ObjectOutput 流。
简单使用例子:
javaCopy code import java.io.*; public class ObjectOutputStreamPutFieldExample {static class User implements Serializable {private static final long serialVersionUID = 1L; private String username;private transient String password; public User(String username, String password) {this.username = username;this.password = password;} // 自定义序列化方法private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields();} @Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}} public static void main(String[] args) {String fileName = "user.ser"; try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建对象User user = new User("john.doe", "password123"); // 将对象写入输出流objectOutputStream.writeObject(user); System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}} }
在这个例子中,我们自定义了 User
类的序列化方法 writeObject()
,并使用 PutField
对象将字段值写入输出流。最后,我们将 User
对象写入文件中。
应用场景
ObjectOutputStream.PutField
通常与自定义序列化方法一起使用,以便更灵活地控制对象的序列化过程。以下是一些常见的应用场景及相应的代码实现:
应用场景 1: 使用 PutField
自定义序列化
javaCopy code import java.io.*; public class CustomSerializationExample {static class User implements Serializable {private static final long serialVersionUID = 1L; private String username;private transient String password; public User(String username, String password) {this.username = username;this.password = password;} private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields();} @Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}} public static void main(String[] args) {String fileName = "user.ser"; try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建对象User user = new User("john.doe", "password123"); // 将对象写入输出流objectOutputStream.writeObject(user); System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}} }
应用场景 2: 将字段写入流并手动写入其他数据
javaCopy code import java.io.*; public class CustomSerializationExample {static class User implements Serializable {private static final long serialVersionUID = 1L; private String username;private transient String password; public User(String username, String password) {this.username = username;this.password = password;} private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields(); // 手动写入其他数据out.writeInt(100); // 写入一个整数out.writeUTF("Additional data"); // 写入一个字符串} @Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}} public static void main(String[] args) {String fileName = "user.ser"; try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建对象User user = new User("john.doe", "password123"); // 将对象写入输出流objectOutputStream.writeObject(user); System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}} }
通过使用 PutField
对象,我们可以更灵活地控制对象的序列化过程,包括哪些字段需要序列化、以及是否需要额外写入其他数据等。
实战例子
以下是一个项目实战示例,演示如何使用 ObjectOutputStream
和 ObjectInputStream
将用户对象列表序列化到文件,并从文件中读取用户对象列表。
javaCopy code import java.io.*; import java.util.ArrayList; import java.util.List; public class UserSerializationProject { static class User implements Serializable {private static final long serialVersionUID = 1L; private String username;private transient String password; // 密码字段不参与序列化 public User(String username, String password) {this.username = username;this.password = password;} @Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}} public static void main(String[] args) {String fileName = "users.ser"; // 创建用户列表List<User> users = new ArrayList<>();users.add(new User("user1", "password123"));users.add(new User("user2", "password456"));users.add(new User("user3", "password789")); // 将用户列表写入文件writeUsersToFile(users, fileName); // 从文件中读取用户列表List<User> readUsers = readUsersFromFile(fileName);System.out.println("Users read from file:");for (User user : readUsers) {System.out.println(user);}} private static void writeUsersToFile(List<User> users, String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {for (User user : users) {outputStream.writeObject(user);}System.out.println("Users have been written to file successfully.");} catch (IOException e) {e.printStackTrace();}} private static List<User> readUsersFromFile(String fileName) {List<User> users = new ArrayList<>();try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {while (true) {try {Object obj = inputStream.readObject();if (obj instanceof User) {users.add((User) obj);}} catch (EOFException e) {break;}}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}return users;} }
在这个示例中,我们定义了一个 User
类来表示用户对象,然后创建了一个包含多个用户对象的列表。我们将用户列表写入文件,并且读取文件以获取用户对象列表。