9.ObjectOutputStream:什么是对象输入输出流???包装流有什么特点???对象输入输出流常用方法有哪些???

    技术2022-07-12  74

    9.ObjectOutputStream:什么是对象输入输出流???包装流有什么特点???对象输入输出流常用方法有哪些???

    学习:第7遍


    1.什么是对象输入输出流???

    如果希望将Java对象写入到IO流中,或从IO流中读取Java对象,则要使用对象输入输出流,称为对象的序列化和反序列化

    ObjectInputStream 对象输入流:用来读取对象,即反序列化

    ObjectOutputStream 对象输出流:用来写入对象,即序列化

    2.包装流有什么特点???

    ObjectInputStream和ObjectOutputStream属于包装流 用于对节点流进行功能扩展 / 包装 在创建包装流,需要传入要操作的节点流对象 当关闭流时,只需要关闭包装流,节点流也会被关闭


    3.对象输入输出流常用方法有哪些???

    创建:必须基于某个节点流,进行包装 oos = new ObjectOutputStream(new FileOutputStream(“c:/aaa/user.data”))

    方法:oos.writeObject(u1) oos.writeObject(users) users是list集合 作用:写入对象

    方法:User u1 = (User) ois.readObject() List<User> list = (List<User>) ois.readObject() 作用:读取顺序和写入顺序一致


    public class Test{ public static void main(String[] args) { test01(); test02(); } // 序列化,写入对象 public static void test01() { User u1 = new User(1001, "tom", 18); u1.setAddress(new Address("江苏", "南京")); User u2 = new User(1002, "jack", 21); u2.setAddress(new Address("江苏", "扬州")); List<User> users = Arrays.asList(u1, u2); ObjectOutputStream oos = null; try { /** * 创建:必须基于某个节点流,进行包装 * oos = new ObjectOutputStream(new FileOutputStream("c:/aaa/user.data")) */ //项目根路径下的user.data oos = new ObjectOutputStream(new FileOutputStream("c:/aaa/user.data")); /** * 方法:oos.writeObject(u1) * oos.writeObject(users) users是list集合 * 作用:写入对象 */ // 写入对象 // oos.writeObject(u1); oos.writeObject(users); oos.flush(); System.out.println("写入对象成功"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (oos != null) { try { // 只需要关闭包装流 oos.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 反序列化,读取对象 public static void test02() { ObjectInputStream ois = null; try { //项目根路径下的user.data ois = new ObjectInputStream(new FileInputStream("user.data")); /** * 方法:User u1 = (User) ois.readObject() * List<User> list = (List<User>) ois.readObject() * 作用:读取顺序和写入顺序一致 */ // 读取顺序和写入顺序一致 // User u1 = (User) ois.readObject(); // System.out.println(u1); List<User> list = (List<User>) ois.readObject(); System.out.println(list); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (ois != null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } } } class User implements Serializable { // 根据类名、接口名、成员方法和属性等生成的一个64位的哈希值 private static final long serialVersionUID = 9112680227154158529L; // 点User 自动生成的 // 如果用int,默认是0,有的数值没有赋值不可以为0 // 都使用包装类型,默认为null private Integer id; private String name; // transient修饰的属性不会被序列化(只有被transient和static静态变量不会被序列化) private transient Integer age; // 对象属性也必须实现Serializable接口 private Address address; public User() { super(); } public User(Integer id, String name, Integer age) { super(); this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", address=" + address + "]"; } } class Address implements Serializable{ private static final long serialVersionUID = -501257177877596419L; private String province; private String city; public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Address(String province, String city) { super(); this.province = province; this.city = city; } public Address() { super(); } @Override public String toString() { return "Address [province=" + province + ", city=" + city + "]"; } }
    Processed: 0.029, SQL: 10