java io文件流序列化_java学习笔记(9)——IO系统 序列化与反序列化

把对象以流的方法,写入到文件中保存:写对象(对象的序列化)

对象中包含的不仅仅是字符,使用字节流

ObjectOutputStream(对象序列化流)

ObjectInputStream(对像反序列化流)

07d75037ebe1535e7d9eeccebdf49811.png

ObjectOutputStream类

对象的序列化流

java.io.ObjectOutputStream extends OutputStream

把对象以流的形式写入到文件中保存

构造方法:ObjectOutputStream(OutputStream out):创建写入指定OutputStream的ObjectOutputStream

参数:

OutputStream out:字节输出流

特有成员方法:void writeObject(Object obj):将指定的对象写入ObjectOutputStream

使用步骤创建ObjectOutputStream对象,构造方法传递字节输出流

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

释放资源

序列化和反序列化时,会抛出NotSerializableException

要实现序列化和反序列化的类必须实现Serializable接口(仅起标记作用)

c6c20ca537758867f7cad6f3d3e8e093.pngpublic class Person implements Serializable {

private String name;

private int age;

....

}public static void main(String[] args) throws IOException {

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person.txt"));

oos.writeObject(new Person("hehe", 18));

oos.close();

}

ObjectInputStream类

对象的反序列化流

java.io.ObjectInputStream extends InputStream

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

构造方法:ObjectInputStream(InputStream In):创建写入指定InputStream的ObjectInputStream

参数:

InputStream in:字节输入流

特有的成员方法:Object readObject() 从ObjectInputStream 读取对象

使用步骤创建ObjectInputStream对象,构造方法传递字节输入流

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

释放资源

使用读取的对象(打印)

readObject()声明会抛出ClassNotFoundException(class文件找不到异常)

反序列化前提:

**1.类必须实现Serializable接口

2.必须存在类对应的class文件**public static void main(String[] args) throws IOException, ClassNotFoundException {

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person.txt"));

Object o = ois.readObject();

ois.close();

System.out.println(o);

Person p = (Person)o;

System.out.println(p.getName() + p.getAge());

}

output:

Person{name='hehe', age=18}

hehe18

e378ce0290315662a6608de0783e573f.png

transient关键字

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

解决方案:

开发者自己定义一个序列号private static final long serialVersionUID = 1L;

案例

序列化集合public static void main(String[] args) throws IOException, ClassNotFoundException {

//定义存储Person对象的数组

ArrayList list = new ArrayList<>();

list.add(new Person("zz", 18));

list.add(new Person("qq", 19));

list.add(new Person("cc", 20));

//存储Person对象到ArrayList数组中

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt"));

oos.writeObject(list);

//读取文件中保存的集合

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt"));

Object o = ois.readObject();

//将Object类型集合转换为ArrayList集合

ArrayList list2 = (ArrayList) o;

for (Person person : list2) {

System.out.println(person.getName() + " " + person.getAge());

}

}

output:

zz 18

qq 19

cc 20

打印流

java.io.PrintStream extends OutputStream

特点:只负责数据输出,不负责数据的读取

永远不会抛出IOException

特有方法:print,println

构造方法:PrintStream(File file):输出目的地是一个文件

PrintStream(OutputStream out):...是一个字节输出流

PrintStream(String fileName):...是一个文件路径

如果使用继承自父类的write方法写数据,查数据会查询编码表

如果使用自身特有的print/println方法写数据,写得数据原样输出

ecb9e3c70cf003442724df9967f3dea4.png

2b6531dd7bd94bb16fcc5620ff03c2e1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值