博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程
一、java.io
1.44 ObjectInputStream
ObjectInputStream
类是用于从输入流中读取Java对象的类,它可以将对象从字节流反序列化为Java对象。以下是关于ObjectInputStream
类的基本介绍:
ObjectInputStream 介绍:
所有字段:
-
protected ObjectInputStream$GetField fields
: 用于读取序列化对象的字段值的GetField
对象。
构造方法:
-
protected ObjectInputStream() throws IOException, SecurityException
:创建一个新的ObjectInputStream
,它使用默认的类加载器和默认的安全管理器。 -
ObjectInputStream(InputStream in) throws IOException
:使用指定的输入流创建一个新的ObjectInputStream
。
方法摘要:
-
void defaultReadObject()
: 从流中读取默认的对象字段值,以恢复对象的状态。 -
GetField readFields()
: 读取序列化对象的字段值,返回一个GetField
对象,可以用于访问字段的值。 -
int read()
: 从输入流中读取一个字节的数据。 -
Object readObject()
: 从输入流中读取对象。 -
int read(byte[] buf, int off, int len)
: 从输入流中读取字节数组的一部分数据。 -
Object readUnshared()
: 从输入流中读取一个未共享的对象。 -
void registerValidation(ObjectInputValidation obj, int prio)
: 注册一个对象验证回调。
简单使用例子:
javaCopy code import java.io.*; public class ObjectInputStreamExample { public static void main(String[] args) { String fileName = "data.ser"; saveDataToFile(fileName); loadDataFromFile(fileName); } private static void saveDataToFile(String fileName) { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { // 将对象保存到文件 MyObject obj = new MyObject("Hello, ObjectInputStream!"); outputStream.writeObject(obj); System.out.println("Object saved to file successfully."); } catch (IOException e) { e.printStackTrace(); } } private static void loadDataFromFile(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { // 从文件加载对象 MyObject obj = (MyObject) inputStream.readObject(); System.out.println("Loaded object from file: " + obj.getData()); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } static class MyObject implements Serializable { private static final long serialVersionUID = 1L; private String data; public MyObject(String data) { this.data = data; } public String getData() { return data; } } }
在这个简单的例子中,我们创建了一个MyObject
类,它实现了Serializable
接口,表示可以序列化。我们将一个MyObject
对象保存到文件中,并使用ObjectInputStream
从文件中加载对象。加载的对象可以强制转换为MyObject
类型,并访问其数据。
应用场景
以下是一些使用 ObjectInputStream
的常见应用场景及相应的代码实现:
应用场景 1: 从文件中读取对象并进行处理
javaCopy code import java.io.*; public class ReadObjectsFromFile { public static void main(String[] args) { String fileName = "data.ser"; try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { Object obj = inputStream.readObject(); // 处理从文件中读取的对象 System.out.println("Object read from file: " + obj); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
应用场景 2: 从网络流中读取对象并进行处理
javaCopy code import java.io.*; import java.net.*; public class ReadObjectsFromNetwork { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8080); ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); Object obj = inputStream.readObject(); // 处理从网络流中读取的对象 System.out.println("Object read from network: " + obj); inputStream.close(); socket.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
应用场景 3: 从字节数组中读取对象并进行处理
javaCopy code import java.io.*; public class ReadObjectsFromByteArray { public static void main(String[] args) { byte[] data = {/* Byte array with serialized object data */}; try (ByteArrayInputStream byteInput = new ByteArrayInputStream(data); ObjectInputStream inputStream = new ObjectInputStream(byteInput)) { Object obj = inputStream.readObject(); // 处理从字节数组中读取的对象 System.out.println("Object read from byte array: " + obj); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
应用场景 4: 读取多个对象直到文件末尾
javaCopy code import java.io.*; public class ReadMultipleObjects { public static void main(String[] args) { String fileName = "data.ser"; try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { while (true) { try { Object obj = inputStream.readObject(); // 处理每个读取的对象 System.out.println("Object read from file: " + obj); } catch (EOFException e) { // 文件末尾,退出循环 break; } } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
这些例子涵盖了从文件、网络、字节数组中读取对象以及处理多个对象的场景。通过 ObjectInputStream
可以方便地实现从不同来源读取对象并进行相应处理。
实战例子
以下是一个简单的项目实战例子,演示了如何使用 ObjectInputStream
读取对象并进行处理:
javaCopy code import java.io.*; public class ObjectInputStreamExample { static class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public static void main(String[] args) { String fileName = "person.ser"; // 写入对象到文件 writeObjectToFile(fileName); // 从文件读取对象并处理 readObjectFromFile(fileName); } private static void writeObjectToFile(String fileName) { try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) { Person person = new Person("Alice", 30); outputStream.writeObject(person); System.out.println("Object written to file successfully."); } catch (IOException e) { e.printStackTrace(); } } private static void readObjectFromFile(String fileName) { try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) { Object obj = inputStream.readObject(); if (obj instanceof Person) { Person person = (Person) obj; System.out.println("Object read from file: " + person); } } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } }
在这个示例中,我们定义了一个 Person
类,实现了 Serializable
接口,表示可以序列化。然后我们将一个 Person
对象写入到文件中,并使用 ObjectInputStream
从文件中读取对象。加载的对象可以转换为 Person
类型,并输出到控制台。