博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中对象流的使用(ObjectInputStream 和 ObjectOutputStream )
阅读量:3964 次
发布时间:2019-05-24

本文共 2967 字,大约阅读时间需要 9 分钟。

1.对象流:

ObjectInputStream 和 ObjectOutputStream

2.作用:

在这里插入图片描述

用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

3.对象的序列化机制:

  • 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种
  • 二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。
  • 当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。

4.序列化过程:

将内存中的java对象保存到磁盘中或通过网络传输出去

使用ObjectOutputStream实现
代码实现:

@Testpublic void testObjectOutputStream() {
ObjectOutputStream oos = null; try {
oos = new ObjectOutputStream(new FileOutputStream("object.dat")); oos.writeObject(new String("EXO大发!")); oos.flush();//刷新操作 oos.writeObject(new Person("朴灿烈",29)); oos.flush(); oos.writeObject(new Person("张艺兴",30,new Account(200000))); oos.flush(); } catch (IOException e) {
e.printStackTrace(); } finally {
if(oos != null){
try {
oos.close(); } catch (IOException e) {
e.printStackTrace(); } } }}

5.反序列化过程:

将磁盘文件中的对象还原为内存中的一个java对象

使用ObjectInputStream来实现
代码实现:

@Testpublic void testObjectInputStream(){
ObjectInputStream ois = null; try {
ois = new ObjectInputStream(new FileInputStream("object.dat")); Object obj = ois.readObject(); String str = (String)obj; Person p1 = (Person)ois.readObject(); Person p2 = (Person)ois.readObject(); System.out.println(str); System.out.println(p1); System.out.println(p2); } catch (IOException e) {
e.printStackTrace(); } catch (ClassNotFoundException e) {
e.printStackTrace(); } finally {
if(ois != null){
try {
ois.close(); } catch (IOException e) {
e.printStackTrace(); } } }}

6.实现序列化的对象所属的类需要满足:

Person需要满足如下的要求,方可序列化

  • 1.需要实现接口:Serializable
  • 2.当前类提供一个全局常量:serialVersionUID
  • 3.除了当前Person类需要实现Serializable接口之外,还必须保证其内部所属性也必须是可序列化的。(默认情况下,基本数据类型可序列化
  • 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
    Person.java类
public class Person implements Serializable {
private static final long serialVersionUID = 66667703L; private String name; private transient int age;//加了transient不会被序列化 private Account account; public Person() {
} public Person(String name, int age) {
this.name = name; this.age = age; } public Person(String name, int age, Account account) {
this.name = name; this.age = age; this.account = account; } 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; } @Override public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + ", account=" + account + '}'; }}

转载地址:http://tvuki.baihongyu.com/

你可能感兴趣的文章
Flutter 路由跳转fluro
查看>>
Flutter 日期插件date_format 中文 国际化 及flutter_cupertino_date_picker
查看>>
Flutter 插件笔记 | 屏幕适配 flutter_screenutil
查看>>
Flutter UI基础 - 侧拉抽屉菜单
查看>>
Flutter UI基础 - AppBar中标题文字如何居中
查看>>
Flutter UI基础 - Drawer 抽屉视图与自定义header
查看>>
Flutter UI基础 - 点击展开和关闭
查看>>
Flutter UI基础 - GridView
查看>>
Flutter UI - 打造一个圆形滑块(Slider)
查看>>
Flutter UI基础 - 分割线效果实现
查看>>
Flutter UI基础 - DecoratedBox组件
查看>>
Flutter UI基础 - 使用InkWell给任意Widget添加点击事件
查看>>
OC WKWebView的使用
查看>>
Flutter UI基础 - Image.asset 图片铺满布局
查看>>
Flutter UI基础 - Row、Column详解
查看>>
Flutter UI基础 - 添加背景图片
查看>>
Flutter UI基础 - 布局之Row/Column/Stack
查看>>
Flutter UI基础 - 层叠布局Stack的使用
查看>>
Flutter UI基础 - webview 使用和交互
查看>>
Flutter UI基础 - 时间选择器
查看>>