Java重修笔记 第六十三天 坦克大战(十三)IO 流 - ObjectInputStream 和 ObjectOutputStream、对处理流的细节整理
-
ObjectInputStream 类的常用方法
1. 写入字符串
public void writeUTF(String str) throws IOException
参数:str - 要写入的字符串
2. 序列化一个对象
public final void writeObject(Object obj) throws IOException
参数:obj - 要写入的对象
说明:此对象应实现 Serializable 或 Externalizable 接口
3. 关闭流
public void close() throws IOException
说明:必须 close 关闭或者 flush 刷新,否则写入不到指定文件
public class ObjectOutputStream01 {
public static void main(String[] args) throws IOException {
String filePath = "d:\\data.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
// 存放数据, 序列化数据到文件中
oos.writeInt(100);
oos.writeBoolean(true);
oos.writeChar('a');
oos.writeDouble(12.5);
oos.writeUTF("韩顺平教育");
// 保存对象
oos.writeObject(new Dog("小黄", 2));
// 关闭流
oos.close();
System.out.println("序列化完成");
}
}
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
-
ObjectOutputStream 类的常用方法
1. 读取对象
public final Object readObject() throws IOException, ClassNotFoundException
返回值:返回读取到的 Object 对象
异常:ClassNotFoundException - 无法找到序列化对象的类
InvalidClassException - 类的序列化版本与从流中读取的类描述符的类型不匹配,或者在加载序列化类的过程中找不到该类
OptionalDataException - 没有读取完前面的元素,或者前面的元素使用的readXXX方法读错了原始数据
说明:反序列化读取顺序,必须和序列化顺序一致,如果要调用该类的特有方法需要获得该类的定义,并向下转型。(要么引入包,要么将该类设置为 public 公有的)
2. 关闭流
public void close() throws IOException
public class ObjectInputStream01 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String filePath = "d:\\data.dat";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
// 反序列化的顺序 必须和序列化的顺序一致
// 存放数据, 序列化数据到文件中
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
// 读取保存对象
System.out.println(ois.readObject());
// 关闭流
ois.close();
System.out.println("反序列化完成");
}
}
-
对处理流的细节
1. 序列化对象必须要实现 Serializable 或者 externalizable
2. 文件读写顺序要一致,若不一致会报 OptionalDataException 异常
3. 序列化的类中建议添加一个 SerialVersionUID,可以提高版本兼容性
4. static 和 transient 关键字修饰的方法和属性不会被序列化,用于保护一些敏感的信息
5. 序列化对象时,该对象的所有属性也都必须实现序列化接口,除了static 和 transient
6. 序列化具有可继承性,如果父类实现了序列化接口,其所有子类也默认实现了序列化接口
原文地址:https://blog.csdn.net/Code___slave/article/details/142773136
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!