java学习之高级语法(二十七)----- 序列化流和打印流

简介: java学习之高级语法(二十七)----- 序列化流和打印流

 序列化流

image.gif编辑

▶  ObjectOutputStream --- 对象的序列化流

java.io.ObjectOutputStream extends OutputStream

作用 :把对象以流的方式写入到文件中保存

✔  构造方法 :

ObjectOutputStream( OutputStream out ) 创建写入指定 OutputStream 的 ObjectOutputStream

参数 :

           OutputStream out  ---  字节输出流

✔  特有的成员方法 :

---  void writeObject( Object obj ) 将指定的对象写入 ObjectOutputStream

✔  使用步骤 :

(1)创建ObjectOutputStream对象,构造方法中传递字节输出流

(2)使用ObjectOutputStream对象中的方法 writeObject,把对象写入到文件中

(3)释放资源

✔  序列化和反序列化的时候会抛出NotSerializableException异常,即没有序列化异常

类通过实现 java.io.Serializable 接口以启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化

Serializable接口也叫标记型接口,要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记

当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记

      ---  有:就可以序列化和反序列化

      ---  没有:就会抛出 NotSerializableException异常

就像去市场买肉-->肉上有一个蓝色章(检测合格)-->放心购买-->买回来怎么吃随意

image.gif编辑

▶  ObjectInputStream  ---  对象的反序列化流

java.io.ObjectInputStream extends InputStream

作用 :把文件中保存的对象,以流的方式读取出来使用

✔  构造方法:

---  ObjectInputStream( InputStream in ) 创建从指定 InputStream 读取的 ObjectInputStream

     参数:

              InputStream in  --  字节输入流

✔  特有的成员方法:

---  Object readObject() 从 ObjectInputStream 读取对象

✔  使用步骤:

(1)创建ObjectInputStream对象,构造方法中传递字节输入流

(2)使用ObjectInputStream对象中的方法readObject读取保存对象的文件

(3)释放资源

(4)使用读取出来的对象(打印)

✔   readObject方法声明抛出了ClassNotFoundException(class文件找不到异常)

当不存在对象的class文件时抛出此异常

✔  反序列化的前提:

(1)类必须实现Serializable

(2)必须存在类对应的class文件

image.gif编辑

▶  transient --- 瞬态关键字

✔  static关键字 :静态关键字

静态优先于非静态加载到内存中(静态优先于对象进入到内存中)

被static修饰的成员变量不能被序列化的,序列化的都是对象

private static int age;
oos.writeObject(new Person("小美女",18));
Object o = ois.readObject();
Person{name='小美女', age=0}

image.gif

✔  transient关键字 :瞬态关键字

被transient修饰成员变量,不能被序列化

private transient int age;
oos.writeObject(new Person("小美女",18));
Object o = ois.readObject();
Person{name='小美女', age=0}

image.gif

▶  InvalidClassException 异常

image.gif编辑

▶  练习 :序列化集合

当我们想在文件中保存多个对象的时候,可以把多个对象存储到一个集合中,对集合进序列化和反序列化

分析:

(1)定义一个存储Person对象的ArrayList集合

(2)往ArrayList集合中存储Person对象

(3)创建一个序列化流ObjectOutputStream对象

(4)使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化

(5)创建一个反序列化ObjectInputStream对象

(6)使用ObjectInputStream对象中的方法readObject读取文件中保存的集合

(7)把Object类型的集合转换为ArrayList类型

(8)遍历ArrayList集合

(9)释放资源

image.gif编辑

打印流

java.io.PrintStream

功能:为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

✔  PrintStream特点:

(1)只负责数据的输出,不负责数据的读取

(2)与其他输出流不同,PrintStream 永远不会抛出 IOException

(3)有特有的方法,print,println

        ---  void print(任意类型的值)

        ---  void println(任意类型的值并换行)

✔  构造方法:

---  PrintStream(File file):输出的目的地是一个文件

---  PrintStream(OutputStream out):输出的目的地是一个字节输出流

---  PrintStream(String fileName) :输出的目的地是一个文件路径

✔  PrintStream extends OutputStream  继承自父类的成员方法:

---  public void close() :关闭此输出流并释放与此流相关联的任何系统资源

---  public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出

---  public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流

---  public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流

---  public abstract void write(int b) :将指定的字节输出流

✔  注意:

如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97->a

如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97->97

image.gif编辑

输出:

          image.gif编辑

✔  改变输出语句的目的地(打印流的流向)

输出语句默认在控制台输出

使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地

---  static void setOut(PrintStream out)  重新分配“标准”输出流。

image.gif编辑

image.gif编辑


相关文章
|
6天前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
62 0
|
1月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
117 1
|
13天前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
117 0
|
13天前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
100 8
|
1月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
55 5
|
1月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
103 5
|
1月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
96 1
|
1月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
150 3
|
20天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
86 1
|
20天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
75 2