java对象流(二)
对象流,可以将java中的对象转为字节进行输出。将对象写入文件时。文件输出流是将字节写入到文件中。
对象流是将给定的对象转化为一组字节。writeObject()方法就是将对象转为字节。
对象流,读的文件肯定是对象进行转换以后的字节。只有实现了Serializable可序列号接口,我们才可以把一个对象进行序列化。
对象流的作用就是:将对象进行序列化和反序列化。将对象转化为字节,然后将字节转化为对象。
将对象转化为字节的时候,会记录变量的属性。转化后文件的大小比对象成员变量大小相加更大。
Serializable接口里是空的。Java自带的空接口也称为签名接口。还有一个接口Cloneable,也是类似的。
这个接口是给java编译器看的。Java编译器在编译的时候,发现如果一个类实现了Serializable,会隐含地给它加一个方法,不会在源代码中体现。
当一个类希望被对象流进行读写,那么该类必须实现接口:
* java.io.Serializable
可以方便在网络中相互传输java对象。
序列化版本号是直接影响一个序列化对象能否反序列化成功。一个类实现了序列化接口,就一定会有序列化版本号。
如果没有直接创建版本号,java编译器会自动生成一个版本号。只要这个类的结构不变,版本号是不会变的。
但是只要类发生了改变,版本号都会发生改变。在反序列化的时候,对象输入流会看反序列化对象的版本号和现在这个类的版本号是否一样,只要不一样,反序列就失败。
如果让系统自动生成版本号,那么类是一点都不能改的。应该明确指定版本号,那么版本号就是可控的。只要类改一下,版本号会变。
自己控制版本号,就算类改了,只要版本号没有变,还是可以反序列化的。版本号变了,反序列化会失败。
对象流在将来读写对象中可以使用。
Person序列化如下所示:
/**
* 使用该类测试对象流的读写操作
*
*/
import java.io.Serializable;
import java.util.Arrays; public class Person implements Serializable{ /**
* 当一个类实现了Serialiazable接口后,编译器会提示
* 我们应当添加一个常量:serialVersionUID
* 序列化版本号影响着反序列化的结果,当对象输入流在反序列化
* 一个实例时会检查该实例与其所属的类的版本是否一致,
* 不一致则反序列化会抛出版本号不一致的异常。若一致则成功进行反序列化
*
* 自行维护版本号可以主动确定反序列化结果。但是若不指定序列化版本号,
* 编译器在编译当前类时会根据当前类的结构生成一个版本号,但是只要当前类发生改变,
* 则版本号一定会改变。
*
*
*
* 当一个类希望被对象流进行读写,那么该类必须实现接口:
* java.io.Serializable
* 该接口没有任何抽象方法,这种接口称为:签名接口。
* 虽然在源代码中不需要重写方法,但实际上编译器在编译该类为class文件时
* 会根据当前类结构添加一个方法,用于将当前类实例转换为一组字节。
*
*/
private static final long serialVersionUID = 1L; private String name;
private int age;
private String gender;
/**
* transient关键字
* 当一个属性被该关键字修饰后,那么该类的某个实例被序列化时,这个值会被忽略。那么在对象反序列化
*/ private transient String[] otherInfo;
//给一个变量添加transient修饰时,进行序列化时不被保留,反序列化时也不被转化。
//序列化了,这个修饰才会有作用。 public Person(String name, int age, String gender, String[] otherInfo) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.otherInfo = otherInfo;
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String[] getOtherInfo() {
return otherInfo;
}
public void setOtherInfo(String[] otherInfo) {
this.otherInfo = otherInfo;
} @Override
public String toString() {
// TODO Auto-generated method stub
return name + ", " + age + ", " + gender + ","+
Arrays.toString(otherInfo);
} }
写入对象的过程如下所示:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; /**
* 对象流
* java.io.ObjectOutputStream
* java.io.ObjectInputStream
*
* 对象流是一对高级流,使用它们可以很方便进行java中任何对象的读写操作
* @author 小明
*
*/
public class OOSDemo { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String name = "苍老师";
int age = 18;
String gender = "女";
String []otherInfo = {"是一名演员", "爱好是写大字",
"长得显小", "促进交流", "演员"};
Person person = new Person(name, age, gender, otherInfo);
//System.out.println(person); /**
* 将person对象写入文件“person.obj"
*/
FileOutputStream fos = new FileOutputStream("person.obj"); /**
* 为了方便写出对象,连接对象输出流
*/
ObjectOutputStream obj = new ObjectOutputStream(fos); /**
* 对象输出流提供的方法:
* void writeObject(Object obj)
* 该方法用于将给定的对象转换为一组字节后写出。
* 需要注意,写出的对象必须实现接口:Serializable
* 否则会抛出异常。
*
*下面的操作经历了两个过程
*1:对象输出流将对象按照结构转化为了一组字节
*这个过程称为:对象序列化
*2:文件输出流将这组字节写入到文件中(硬盘上)做长久保存的过程称为:数据持久化。
*
*
*
*/
obj.writeObject(person);
System.out.println("写出完毕"); obj.close(); } }
读出对象的过程如下所示:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class OISDemo { public static void main(String[] args) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("person.obj"); ObjectInputStream ois = new ObjectInputStream(fis); /**
* 对象流读取字节必须是对象输出流将一个对象
* 转换的一组字节,否则读取过程会抛出类没有找到的
* 异常:ClassNotFoundException
*
* 将一组字节还原为对象的过程称为:对象反序列化。
*/
Person person = (Person)ois.readObject();
System.out.println(person);
ois.close();
} }
输出结果如下所示:
java对象流(二)的更多相关文章
- 动车上的书摘-java对象流与序列化
摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 钢笔不限贵便宜,书法是来自心对手的交流.-泥沙砖瓦浆木匠 一.对 ...
- 理解Java对象序列化(二)
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
- java --对象流与对象的序列化
对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...
- Java对象流的使用
为了让对象持久化(把对象存储到本地),可以使用java的对象流处理对象,把对象的内容写到本地存储的文件中,也可以从本地文件中读取出来.也就是常说的序列化和反序列化 主要用到了ObjectInputSt ...
- java对象流(一)
注意:字节数组流是可以不用关闭的(字符数组流要不要关闭暂时不清楚). 对象流的读数据和写数据方法分别是writeObject(Object o)和readObject(Object o). Objec ...
- java 对象流的简单使用
对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息. 使得对象持久化. ObjectInputStream : 对象输入流 ObjectOutPutStream :对象输出流 ...
- Java对象流与序列化学习
对象流与序列化 对象流有两个类 ObjectOutputStream:将java对象的基本数据类型和图形写入OutputStream ObjectInputStream:对以前使用ObjectOutp ...
- java对象流与序列化
Object流,直接把obj写入或读出. 前言: 比如 画图的程序,咣当画一个三角形出来,咣当画一正方形出来.然后存盘,当你下次再打开软件的时候三角形.方块还在原来的位置上.如果用面向对象的思维,三角 ...
- Java IO流(二)
目录 字节缓冲流 概述 BufferedOutputStream类 继承父类的共性成员方法 构造方法 BufferedInputStream类 继承自父类的方法: 构造方法 文件复制练习(增强版 使用 ...
随机推荐
- 一个有趣的IP不同的问题?
1.我们已经知道了内网和外网的显示是不同的. 2.今天发现了我的飞Q传输上显示的ip和电脑上网络中显示的ip不同,但是传输文件是可以的,至于这个问题目前没有找到合理的解释,解释这个问题,但是这样就奇怪 ...
- setlocale(LC_ALL, ""); 取值为空字符串" "(注意,不是NULL),则locale与本地环境所使用的编码方式相同(在本地化时,应该很有用);
在C运行库提供的多字节字符-宽字符转换函数:mbstowcs()/wcstombs()中,需要用到全局变量locale( locale encoding ),以指定多字节字符的编码类型 1. 功能: ...
- python基础:while循环,for循环
---恢复内容开始--- 1.使用while循环输出1 2 3 4 5 6 8 9 10 2.求1-100的所有数的和 3.输出 1-100 内的所有奇数 4.输出 1-100 内的所有偶数 ...
- git读取配置文件的顺序
a.查找系统配置文件: /etc/gitconfig 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值 b.查找用户配置文件: ~/.gitconfig 文件 或者 ~/.config/ ...
- JavaScript四则运算计算器
直接上代码: 首先是HTML代码 <form> 第一个数字:<br> <input type="text" id="num1"&g ...
- (扫盲)WebSocket 教程
原文地址:http://www.ruanyifeng.com/blog/2017/05/websocket.html WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebS ...
- 剑指offer 面试60题
面试60题 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 解决代码:
- PL/SQL连接ORACLE失败,ORA-12154: TNS: could not resolve the connect identifier specified
项目需要使用ORACLE,安装了oracle之后,使用PL/SQL连接,先是提示NOT logger ,后续不知道改了什么提示解析服务器id失败,重新装了之后更狠的直接来了个空白提示 一.安装PLS ...
- 佳能相机操作 EDSDK 教程 C# 版本
http://blog.csdn.net/zajin/article/details/17021339 介绍 佳能EOS数码SDK是一个 可以用来远程控制其数码单反相机相当强大的SDK.不幸的是 ...
- pycharm一直scanning files to index
删除了c盘的垃圾文件之后,pycharm就一直scanning files to index 解决方法: 点击file,然后选择invalidate caches / restart ...,再弹出的 ...