IO流学习07(Java)

news/2024/11/30 10:49:02/

序列化流(对象操作输出流):

可以把java中的对象写到本地文件中。

public objectoutputstream(outputstream out)    把基本流包装成高级流。

public final void writeobject(object obj)    把对象序列化(写出)到文件中去。

细节:使用序列化流将对象保存到文件时会出现NotSerializableException异常,可以采取让javabean类实现Serializable接口来解决问题。

Serializable接口里面时没有抽象方法的,是一个标记型接口,一旦实现了这个接口,那么就表示当前类可以被序列化。

案例需求:利用序列化流,把一个对象写到本地文件中。

代码实现:

package com.zhou.myobjectstream;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class ObjectStreamDemo01 {public static void main(String[] args) throws IOException {/*需求:利用序列化流,把一个对象写到本地文件中*///1.创建对象Student stu = new Student("张三",23);//2.创建序列化流的对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IdeaFile\\MyIO\\AnLi.txt"));//3.写出数据oos.writeObject(stu);//4.释放资源oos.close();}
}

再写一个Student类:

package com.zhou.myobjectstream;import java.io.Serializable;public class Student implements Serializable {public Student(){}public Student(String name,int age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString(){return "Student{name = " + name + ", age = " + age + "}";}private String name;private int age;}

运行结果:

此时,Student类便被序列化后被保存到了文件当中。

反序列化流:

可以把序列化到本地文件中的对象,去读到程序中来。

public objectInputstream( Inputstream out)    把基本流变成高级流

public object readobject()    把序列化到本地文件中的对象,读取到程序中来

案例需求:利用序列化流,把一个本地文件职中的对象读到程序中。

代码实现:

package com.zhou.myobjectstream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;public class ObjectStreamDemo02 {public static void main(String[] args) throws IOException, ClassNotFoundException {/*利用序列化流,把一个本地文件职中的对象读到程序中。*///1.创建反序列化流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IdeaFile\\MyIO\\AnLi.txt"));//2.读取数据Object o = ois.readObject();//3.打印对象System.out.println(o);//4.关闭资源ois.close();}
}

注意:读取到的数据是Object类型的!如果想要真正的Stdent类,还需要做一个强转。

Student o = (Student) ois.readObject();

其运行结果是一致的。

序列化流及反序列化流使用细节:

在建好对象后,使其实现Serializable接口,再对其实现序列化将其保存到本地文件当中,当我们修改对象时,再使用反序列化将其从本地文件以对象的形式读到程序当中,会出下报错,这是因为每一次序列化,都会根据对象中所包含的所有成员生成一个版本号,序列化后,文件当中也会包含这个版本号此时,如果修改了java文件,会导致文件中的版本号和JavaBean的版本号不匹配,从而报错。

因为在实际开发中,必须根据业务对Javabean进行修改,所以不更改JavaBean是不可能的,所以解决方案应该是,固定一个版本号。

版本号命名格式:private static final long serialVersionUID = 1L;

如果有在JavaBean文件中,有不想被序列化的成员变量,可以在成员变量前面加上transient(瞬态)关键字。

transient的作用:不会把当前属性序列化到本地文件当中。

练习:

将多个自定义对象序列化到文件中,但是对象的个数不确定,该如何操作呢?

可以将对象全部放到ArrayList集合当中,对ArrayList序列化,在读的时候只需要对集合实现遍历即可。

接下来实现:

先写好一个对象:

package com.zhou.myobjectstream;import java.io.Serializable;public class Teacher implements Serializable {private static final long serialVersionUID = -1108545422521561957L;public Teacher(){}public Teacher(String name,String sex,int age){this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Teacher{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}';}private String name;private String sex;private int age;}

序列化流:

package com.zhou.myobjectstream;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;public class ObjectStreamDemo03 {public static void main(String[] args) throws IOException {Teacher t1 = new Teacher("章程","男",41);Teacher t2 = new Teacher("李元","男",36);Teacher t3 = new Teacher("周强","男",57);ArrayList<Teacher> list = new ArrayList<>();list.add(t1);list.add(t2);list.add(t3);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\IdeaFile\\MyIO\\XuLie.txt"));oos.writeObject(list);oos.close();}
}

反序列化流,读取对象:

package com.zhou.myobjectstream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;public class ObjectStreamDemo04 {public static void main(String[] args) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\IdeaFile\\MyIO\\XuLie.txt"));ArrayList<Teacher> list = (ArrayList<Teacher>)ois.readObject();for(Teacher teacher : list){System.out.println(teacher);}ois.close();}
}

另外准备好一个本地文件用于保存JavaBean文件:

运行结果:

 

 

 

 


http://www.ppmy.cn/news/820468.html

相关文章

计算机主机显卡安装,电脑如何安装独立显卡|电脑安装独立显卡的方法

本教程和大家分享电脑安装独立显卡的方法&#xff0c;电脑已经成为大家生活和办公中不可缺少的一部分了&#xff0c;电脑显卡也是大家关心的问题。显卡分为独立显卡和集成显卡&#xff0c;独立显卡需要插在主板的相应接口上&#xff0c;具备单独的显存&#xff0c;不占用系统内…

计算机显卡的安装步骤简约,自己组装电脑:显卡安装教程

装机第五步&#xff1a;显卡安装 主板核心模块安装到机箱中后&#xff0c;接下来就可以安装独立显卡安装了。显卡安装也是比较简单的&#xff0c;主要需要将显卡安装到主板的PCI插槽&#xff0c;然后将显卡固定在机箱上即可&#xff0c;下面我们详细看看显卡安装过程。 安装显卡…

【代码随想录day7】赎金信

题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入…

第三章:存储系统

文章目录 3.1 存储器概述1.多级层次的存储系统 (存储器的层次化结构)2.存储器分类3.存储器的性能指标3.2 主存储器1.主存储器的基本组成(3)引脚数目 = 地址线 + 数据线 + 片选线 + 读/写控制线2.RAM:SRAM、DRAM(1)SRAM与DRAM的特点(2)DRAM按行刷新、刷新策略(3)DRAM芯片:地址…

宏基因组 微生物组 微生物生态领域杂志简介及最新影响因子

综合类 自然 Nature 自然系统等级简介 科学 Science细胞 Cell美国科学院院报 PNAS 微生物组领域 ISME Journal微生物组 MicrobiomemBio微生物学前沿 Frontiers in Microbiology CNS子刊 自然生物技术 Nature Biotechnology自然方法 Nature Methods自然综述微生物 Nature Review…

小红书上架,一场蹭流量闹剧的终结?

△职场和新商业 △ 作者 | 婷婷的勇敢世界 来源 | 几何小姐姐&#xff08;ID&#xff1a;jihexj&#xff09; 小红书重新上架了。看起来除了小红书团队本身&#xff0c;就数小红书的重度用户和小红书的渠道合作伙伴最高兴了。前者不用再费劲下载&#xff0c;后者又可以开怀赚…

《小狗钱钱》摘录——2019年04月14日19:11:50

小狗钱钱&#xff08;套装全2册&#xff0c;风靡欧美的财富启蒙&#xff0c;性格养成少儿读物&#xff09;: 《小狗钱钱》《小狗钱钱2》 〔德〕博多舍费尔 第一章 白色的拉布拉多犬 标注( 黄色) - 位置 324 “可是我对其他话题更感兴趣。”我心想&#xff0c;况且妈妈常说&…

新手必备的十大运营辅助工具

不管是在哪个平台做哪种形式的自媒体&#xff0c;流量都是我们的核心&#xff0c;得流量者得天下。那么引流技术就非常的关键了&#xff0c;今天给大家介绍11款自媒体引流辅助工具&#xff0c;帮助你更加精准快速的引流。&#xff08;排名不分先后&#xff09; 1.艾瑞指数 在…