博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.48 ObjectOutputStream
ObjectOutputStream
类用于将对象序列化为字节流。它可以将 Java 对象写入输出流中,以便存储到文件、网络或其他输出目标。
ObjectOutputStream 类介绍:
所有字段:
-
没有字段。
构造方法:
-
ObjectOutputStream(OutputStream out) throws IOException
:创建一个新的 ObjectOutputStream,将其写入指定的 OutputStream。
方法摘要:
-
void writeObject(Object obj) throws IOException
:将指定的对象写入流中。 -
void flush() throws IOException
:刷新输出流,强制将所有缓冲的输出字节写入流中。 -
void close() throws IOException
:关闭输出流,释放与流相关的任何系统资源。
简单使用例子:
下面是一个简单的例子,演示了如何使用 ObjectOutputStream 将对象写入文件:
javaCopy code import java.io.*; public class ObjectOutputStreamExample { public static void main(String[] args) { String fileName = "object.ser"; try (OutputStream outputStream = new FileOutputStream(fileName); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建对象 MyObject obj = new MyObject("Hello, world!"); // 将对象写入输出流 objectOutputStream.writeObject(obj); System.out.println("Object has been written to file successfully."); } catch (IOException e) { e.printStackTrace(); } } } class MyObject implements Serializable { private static final long serialVersionUID = 1L; private String data; public MyObject(String data) { this.data = data; } @Override public String toString() { return "MyObject{" + "data='" + data + '\'' + '}'; } }
在上面的例子中,我们首先创建了一个 MyObject
类,并实现了 Serializable
接口。然后,我们使用 ObjectOutputStream
将 MyObject
对象写入到名为 "object.ser" 的文件中。通过调用 writeObject()
方法,我们将对象写入到输出流中。
应用场景
下面是使用 ObjectOutputStream
的一些常见应用场景以及相应的代码实现:
应用场景 1: 将对象序列化并写入文件
javaCopy code import java.io.*; public class SerializeObjectToFile { public static void main(String[] args) { String fileName = "object.ser"; try (OutputStream outputStream = new FileOutputStream(fileName); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建并写入对象到文件 MyObject obj = new MyObject("Hello, world!"); objectOutputStream.writeObject(obj); System.out.println("Object has been written to file successfully."); } catch (IOException e) { e.printStackTrace(); } } } class MyObject implements Serializable { private static final long serialVersionUID = 1L; private String data; public MyObject(String data) { this.data = data; } @Override public String toString() { return "MyObject{" + "data='" + data + '\'' + '}'; } }
应用场景 2: 将对象序列化并写入网络流
javaCopy code import java.io.*; import java.net.*; public class SerializeObjectToNetwork { public static void main(String[] args) { try (Socket socket = new Socket("localhost", 12345); OutputStream outputStream = socket.getOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) { // 创建并写入对象到网络流 MyObject obj = new MyObject("Hello, world!"); objectOutputStream.writeObject(obj); System.out.println("Object has been written to network stream successfully."); } catch (IOException e) { e.printStackTrace(); } } }
应用场景 3: 将对象序列化并写入数据库 Blob 字段
javaCopy code import java.io.*; import java.sql.*; public class SerializeObjectToDatabase { public static void main(String[] args) { try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password"); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO MyTable (object_data) VALUES (?)")) { // 创建对象并将其序列化为字节数组 MyObject obj = new MyObject("Hello, world!"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try (ObjectOutput objectOutput = new ObjectOutputStream(byteArrayOutputStream)) { objectOutput.writeObject(obj); } // 将对象数据写入数据库 Blob 字段 preparedStatement.setBytes(1, byteArrayOutputStream.toByteArray()); preparedStatement.executeUpdate(); System.out.println("Object has been written to database successfully."); } catch (SQLException | IOException e) { e.printStackTrace(); } } }
这些是使用 ObjectOutputStream
的一些常见应用场景及相应的代码实现,包括将对象序列化并写入文件、网络流和数据库 Blob 字段中。
实战例子
下面是一个示例项目,演示了如何使用 ObjectOutputStream
将用户对象写入文件,并使用 ObjectInputStream
从文件中读取用户对象:
javaCopy code import java.io.*; public class UserSerializationExample { 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; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } } public static void main(String[] args) { String fileName = "users.ser"; // 写入用户对象到文件 writeUsersToFile(fileName); // 从文件中读取用户对象并处理 readUsersFromFile(fileName); } private static void writeUsersToFile(String fileName) { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { User user1 = new User("user1", "password123"); User user2 = new User("user2", "password456"); outputStream.writeObject(user1); outputStream.writeObject(user2); System.out.println("Users have been written to file successfully."); } catch (IOException e) { e.printStackTrace(); } } private static void readUsersFromFile(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { while (true) { try { Object obj = inputStream.readObject(); if (obj instanceof User) { User user = (User) obj; System.out.println("User read from file: " + user); } } catch (EOFException e) { // 到达文件末尾 break; } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
在这个示例项目中,我们创建了一个 User
类,并实现了 Serializable
接口。然后,我们使用 ObjectOutputStream
将两个 User
对象写入到名为 "users.ser" 的文件中。接着,我们使用 ObjectInputStream
从文件中读取用户对象,并进行处理。