java对象流
/**
* 对象流ObjectInputStream/ObjectOutputStream
* 处理流,将对象序列化(类似编码)通过节点流存储、反序列化(类似解码)通过节点流读取对象。常用于将对象保存至文件、网络传输及从文件、网络中读取对象
* 序列化/串行化serialization对象时需要对象实现Serializable可串行化的/可序列化的 接口
*/
public class ObjectStream1 {
public static void main(String[] args) {
try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testObject.objects")))){
//字节节点流一般会外套缓冲流,因为字节流读取文件是逐字节进行读取的,所以后缀是否有和后缀写什么都不会影响文件的读取,而因为文件中写入的是对象,所以一般常用的各种类型的软件都不可能正确读取内容,也就不需要设定为txt了
oos.writeBoolean(true);
oos.writeByte(255);
oos.writeChar('a');
oos.writeDouble(Math.random());
oos.writeUTF("对象流也可以存取基础数据类型,用法和数据流相同,但两者不是继承关系");
oos.flush();
//用记事本打开结果为: wq a?鈹墫圔? c瀵硅薄娴佷篃鍙互瀛樺彇鍩虹鏁版嵁绫诲瀷锛岀敤娉曞拰鏁版嵁娴佺浉鍚岋紝浣嗕袱鑰呬笉鏄户鎵垮叧绯?
} catch (Exception e) {
e.printStackTrace();
}
try(ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("iostream/testObject.objects")))){
boolean bo = ois.readBoolean();
byte by = ois.readByte();
char ch = ois.readChar();
double dou = ois.readDouble();
String st = ois.readUTF();
System.out.println(bo+"\t"+by+"\t"+ch+"\t"+dou+"\t"+st);
//和数据流相同,必须按照存储顺序进行数据类型的读取,直接返回原数据类型,结果为:true -1 a 0.50018980655707
// 对象流也可以存取基础数据类型,用法和数据流相同,但两者不是继承关系,对象流在实例化时会实例化一个数据流对象,一部分基础数据类型的存取方法是通过数据流对象完成的
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
class UserObject implements Serializable{
//创建可序列化对象,需要实现Serializable接口,Serializable接口内没有任何方法,是一个标记接口,想要序列化必须打标记
//创建javabean
private int id;
private String name;
private boolean gender;
//gender性别
public UserObject(int id, String name, boolean gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
public UserObject() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public String toString() {
return "UserObject{" +
"id=" + id +
", name='" + name + '\'' +
", gender=" + gender +
'}';
}
}
class ObjectStream2{
public static void main(String[] args) {
UserObject user1 = new UserObject(1,"zhao",true);
UserObject user2 = new UserObject(2,"sun",false);
UserObject user3 = new UserObject(3,"li",true);
try(ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testObject.objects")))) {
oos.writeObject(user1);
oos.writeObject(user2);
oos.writeObject(user3);
//序列化
oos.flush();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
try(ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("iostream/testObject.objects")))) {
UserObject u1 = (UserObject) ois.readObject();
//反序列化.readObject()返回Object对象,需要强转回User,这意味着读取方需要知道对象的原始类型并且读取方JVM虚拟机能找到这个类(否则抛ClassNotFoundException)
UserObject u2 = (UserObject) ois.readObject();
UserObject u3 = (UserObject) ois.readObject();
System.out.println(u1);
System.out.println(u2);
System.out.println(u3);
//结果为UserObject{id=1, name='zhao', gender=true} UserObject{id=2, name='sun', gender=false} UserObject{id=3, name='li', gender=true}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}