基本概念
对象流(ObjectInputStream 和 ObjectOutputStream)的作用是,对基本数据和对象进行序列化操作支持。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能被ObjectInputStream/ObjectOutputStream所操作
实例探究
注意:读取的顺序要和写入的顺序一致,不然可能会抛出异常。
public class Test {
private static final String TMP_FILE = "E:"+File.separator+"person.txt";
public static void main(String[] args) {
write();
read();
}
private static void write() {
try {
//写入基本数据类型
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(TMP_FILE)));
oos.writeBoolean(true);
oos.write((byte) 65);
oos.writeChar('a');
oos.writeInt(100);
oos.writeFloat(3.14F);
oos.writeDouble(1.414D);
//写入 HashMap 对象
HashMap map = new HashMap();
map.put("one", "red");
map.put("two", "green");
oos.writeObject(map);
//写入 object 对象
Person person = new Person("test", 18);
oos.writeObject(person);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void read() {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(TMP_FILE)));
// 读取基本类型
System.out.printf("boolean:%b\n", ois.readBoolean());
System.out.printf("byte:%d\n", (ois.readByte() & 0xff));
System.out.printf("char:%c\n", ois.readChar());
System.out.printf("int:%d\n", ois.readInt());
System.out.printf("float:%f\n", ois.readFloat());
System.out.printf("double:%f\n", ois.readDouble());
// 读取 HashMap 对象
HashMap map = (HashMap) ois.readObject();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.printf("%-6s -- %s\n", entry.getKey(), entry.getValue());
}
// 读取 object 对象
Person person = (Person) ois.readObject();
System.out.println("person:" + person);
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//内部类,实现了 Serializable 接口表示该类可以被序列化
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString() {
return "name is " + name + ",age is " + age;
}
}