Java对象流的使用
为了让对象持久化(把对象存储到本地),可以使用java的对象流处理对象,把对象的内容写到本地存储的文件中,也可以从本地文件中读取出来。也就是常说的序列化和反序列化
主要用到了ObjectInputStream(对象输入流) ObjectOutPutStream(对象输出流 )处理对象
使用对象流处理对象进行持久化的顺序是,先创建目标路径,然后创建流通道,之后调用对象流
以下代码声明了两个类分别是Student,Teacher,都有三个属性,在创建对象的时候赋值
代码:
package demo_io;
import java.io.*;
public class Test {
public static void main(String[] args) {
Student s = new Student(1001, "lisi", "男");
Teacher t = new Teacher(1, "s", "girl");
print(s,t);
out();
}
public static void print(Student s,Teacher t) {
//声明一个文件(创建文件)
File file = null;
//声明文件输出字节流
FileOutputStream fos = null;
//声明对象处理流
ObjectOutputStream oos = null;
try {
file = new File("E:\\a.txt");
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
//向文件中写入对象的数据
oos.writeObject(s);
oos.writeObject(t);
//清空缓冲区
oos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭资源
fos.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void out() {
File file = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
file = new File("E:\\a.txt");
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
Student s = (Student) ois.readObject();
Teacher t = (Teacher) ois.readObject();
System.out.println(s.toString());
System.out.println(t.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
fis.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//创建一个可以序列化的类,必须实现Serializable接口,接口中没有任何方法,只是一个标记
class Student implements Serializable{
public int id;
public String name;
public String sex;
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
//创建一个可以序列化的类,必须实现Serializable接口,接口中没有任何方法,只是一个标记
class Teacher implements Serializable{
public int id;
//声明一个暂时的属性,用transient标记的属性不被序列化,不能被写入磁盘
public transient String name;
public String sex;
public Teacher(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
writeObject(Object o); //向磁盘写入对象 readObject(); //读取磁盘的对象,注意这里需要强制类型
以下是在本地的文件中的数据(出现乱码),它不是简单的把对象属性值写入IO流中,而是按照一定的数据格式写入的。而这种格式,不是记事本、写字板、Word等文本编辑器能够识别的,因为,这些数据,压根就不是文本数据。只有使用相同版本的Java的ObjectInputStream来进行读取操作。
sr demo_io.Student聇鋏Knb I idL namet Ljava/lang/String;L sexq ~ xp 閠 lisit 鐢穝r demo_io.Teacher?椮嗲Wm I idL nameq ~ L sexq ~ xp t st girl
实际输出:因为Teacher中的name用transient修饰的属性,所以不能被保存
Student{id=1001, name='lisi', sex='男'}
Teacher{id=1, name='null', sex='girl'}
在使用流的时候,注意要清空缓冲区,还有就是最后要关闭流,如果你不想将某些信息存入到磁盘 就可以同过transient关键字修饰成员变量,想要序列化必须要实现Serializable接口,这个接口中没有任何方法,只是标记告诉虚拟机这个类要序列化。
Java对象流的使用的更多相关文章
- java --对象流与对象的序列化
对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...
- 动车上的书摘-java对象流与序列化
摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 钢笔不限贵便宜,书法是来自心对手的交流.-泥沙砖瓦浆木匠 一.对 ...
- java对象流(一)
注意:字节数组流是可以不用关闭的(字符数组流要不要关闭暂时不清楚). 对象流的读数据和写数据方法分别是writeObject(Object o)和readObject(Object o). Objec ...
- java对象流(二)
对象流,可以将java中的对象转为字节进行输出.将对象写入文件时.文件输出流是将字节写入到文件中. 对象流是将给定的对象转化为一组字节.writeObject()方法就是将对象转为字节. 对象流,读的 ...
- java 对象流的简单使用
对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息. 使得对象持久化. ObjectInputStream : 对象输入流 ObjectOutPutStream :对象输出流 ...
- Java对象流与序列化学习
对象流与序列化 对象流有两个类 ObjectOutputStream:将java对象的基本数据类型和图形写入OutputStream ObjectInputStream:对以前使用ObjectOutp ...
- java对象流与序列化
Object流,直接把obj写入或读出. 前言: 比如 画图的程序,咣当画一个三角形出来,咣当画一正方形出来.然后存盘,当你下次再打开软件的时候三角形.方块还在原来的位置上.如果用面向对象的思维,三角 ...
- java 对象流
TV.java import java.io.*; public class TV implements Serializable{ String name; int price; public vo ...
- Java自学-I/O 对象流
Java 对象流 ObjectInputStream,ObjectOutputStream 对象流指的是可以直接把一个对象以流的形式传输给其他的介质,比如硬盘 一个对象以流的形式进行传输,叫做序列化. ...
随机推荐
- Python多进程----从入门到放弃
Python多进程 (所有只写如何起多进程跑数据,多进程数据汇总处理不提的都是耍流氓,恩,就这么任性) (1)进程间数据问题,因为多进程是完全copy出的子进程,具有独立的单元,数据存储就是问题了 ( ...
- EntityFramework Core 2.0全局过滤(HasQueryFilter)
前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求.在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilte ...
- Node 定时器详解
JavaScript 是单线程运行,异步操作特别重要. 只要用到引擎之外的功能,就需要跟外部交互,从而形成异步操作.由于异步操作实在太多,JavaScript 不得不提供很多异步语法.这就好比,有些人 ...
- 【转载】SDL2.0在mfc窗口中显示yuv的一种方法
DWORD ThreadFun(){ //用mfc窗口句柄创建一个sdl window SDL_Window * pWindow = SDL_CreateWindowFrom( (void ...
- R语言︱缺失值处理之多重插补——mice包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:缺失值是数据清洗过程中非常重要的问题 ...
- code is 9998;desc is 插入失败exception is org.hibernate.exception.JDBCConnectionException: Could not op
1.错误描述 [ERROR:]2015-05-05 09:27:12,090 [插入失败] org.hibernate.exception.JDBCConnectionException: Could ...
- Linux显示包含全部的文件系统
Linux显示包含全部的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -a 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev ...
- 【HAOI2009】毛毛虫
题面 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入 ...
- 【UVA 11426】gcd之和 (改编)
题面 \(\sum_{i=1}^{n}\sum_{j=1}^m\gcd(i,j)\mod998244353\) \(n,m<=10^7\) Sol 简单的一道莫比乌斯反演题 \(原式=\sum_ ...
- 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...