/*
ObjectOutputStream 叫做序列化流。 可以将java程序中的对象写入到文件中。
构造方法:
ObjectOutputStream(OutputStream out): 传递一个字节输出流对象。
写对象方法:
void writeObject(Object obj): 向文件中写入对象。
使用步骤:
1. 创建序列化流对象。
2. 调用writeObject方法,向文件中写入一个指定的对象。
3. 调用close方法,释放资源
要写入到文件的类的对象,必须实现一个接口,这个接口叫做Serializable。
这个接口叫做序列化接口。只有实现这个接口的类的对象,才具备序列化的作用
*/
public class Demo01ObjectOutputStream {
public static void main(String[] args) throws IOException {
//1.创建序列化流对象,传入字节输出流对象
//创建字节输出流对象
FileOutputStream fos=new FileOutputStream("E:\\就业班代码\\fiel02.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
//2 调入writeObject方法,向文件中写入一个指定对象
Person p=new Person();
oos.writeObject(p);
oos.close();//释放资源
}
}
/* ObjectInputStream是反序列化流,可以将文件中的对象读取到java程序中。
构造方法:
ObjectInputStream(InputStream in): 传递一个字节输入流
读取对象的方法
Object readObject(): 从文件中读取对象并返回
如果读取的时候,这个类不存在,那么就会抛出ClassNotFountException
*/
public class Demo02ObjectInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1创建反序列化流对象,并传递字节输入流对象作为参数
FileInputStream fis=new FileInputStream("fiel02.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Object o = ois.readObject();
Person p=(Person)o;
System.out.println(p.getAge()+p.getName());
ois.close();
}
}
public class Demo04StaticAndTransient { //定义方法,将文件中的Person对象读取到Java程序中 public static void main(String[] args) throws IOException, ClassNotFoundException { writeObject(); readObject(); } //向文件中读取一个对象 public static void readObject() throws IOException, ClassNotFoundException { //创建ObjectInputStream反序列化流对象 //创建字节流输入对象作为参数,并绑定目标文件 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\就业班代码\\fiel02.txt")); //调用readObject进行读取 Object obj = ois.readObject(); Person p = (Person) obj; System.out.println(p.getName() + "-" + p.getAge()); } //向文件中写入一个对象 public static void writeObject() throws IOException { //创建序列化流对象,传入字节输出流对象作为参数 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\就业班代码\\fiel02.txt")); oos.writeObject(new Person(18, "李白")); oos.close(); } }
/* Serializable这个接口中没有任何方法。这个接口只是做一个标记。 只有实现这个接口的类的对象,才能被序列化。 如何给类分配一个固定不变的版本号(序列号) 在类的成员位置提供一个long类型的静态常量即可,这个静态常量必须叫做serialVersionUID */ public class Person implements Serializable{ //给这个类分配一个固定的版本号,不管这个类的内容怎么修改,类的版本号永远是0 private static final long serialVersionUID = 0L; private String name; private /*static*/ /*transient*/ int age; public void sleep() { } public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
*练习 1. 将存有多个自定义对象的集合序列化操作,保存到 list.txt 文件中。 2. 反序列化 list.txt ,并遍历集合,打印对象信息 思路: 1. 创建集合,并且添加多个Person对象。 2. 序列化流对象 3. 将集合写入到文件。 4. 创建反序列化流 5. 把文件中的集合对象读取出来。 */ public class Demo05Test { public static void main(String[] args) throws IOException, ClassNotFoundException { //创建集合存储对象 ArrayList<Person> list = new ArrayList<>(); //存储几个Person对象 list.add(new Person(18, "李白")); list.add(new Person(19, "郭德纲")); list.add(new Person(12, "马云")); //创建序列化对象,传入字节输出流对象作为参数 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\就业班代码\\day010\\src\\list.txt")); //调用序列化流方法,将集合写入文件 oos.writeObject(list); //创建反序列化流对象,创建字节输入流对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\就业班代码\\day010\\src\\list.txt")); //调用方法,将文件中的对象集合读出 Object o = ois.readObject(); //向下强转为person类型 ArrayList<Person> list2 = (ArrayList<Person>) o; System.out.println(list2); //遍历集合 for (Person person : list) { System.out.println(person.getAge() + "的" + person.getName()); } } }