[Java][IO][Serializable]序列化+写出读取对象内容+try-with-resources

我们先从我犯的一个错误开始看起

 try{
           FileInputStream fis = new FileInputStream("person.bin");
           BufferedInputStream bis = new BufferedInputStream(fis);
           ObjectInputStream ois = new ObjectInputStream(bis);
           temp = (List) ois.readObject();
           for(Student student : temp){
               System.out.println(student);
           }
           fis.close();
           bis.close();
           ois.close();

       } catch (IOException|ClassNotFoundException e) {
           e.printStackTrace();
       }

我试图在一个try-catch结构里面显式地关闭fis bis以及ois这三个对象,防止其对资源的滥用。

但是会产生两个问题

  1. 资源无法正常关闭:在 try 块中,创建了 FileInputStream、BufferedInputStream 和 ObjectInputStream 等资源,但是在 catch 块中没有对这些资源进行关闭操作。这意味着这些资源可能会一直占用系统资源,造成资源泄漏问题。

  2. 可能会导致数据读取失败:如果在从文件中读取对象时发生异常,那么变量 temp 可能为空或者包含不完整的数据。这可能会导致后续的代码出现问题,例如 NullPointerException 或其他运行时异常



    由此我们得到一个新的知识:当我们在IO流中需要去关闭一个对象对资源的占用时,最好是不要写try-catch这种结构。而是用一个try with resource的结构。这种结构将需要定义的对象放在try的括号中, Java会帮助我们自己去关闭它,不需要手动释放和关闭我们可以看下面的修改例子

try (FileOutputStream fos = new FileOutputStream("person.bin");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            ObjectOutputStream oos = new ObjectOutputStream(bos)) {
           oos.writeObject(students);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }

 接下来我们来讲:序列化(Serialization)

实际上是将若干个对象储存到bin文件中,并且用二进制储存。注意,此时如果你尝试用txt文本打开这个Bin文件,一定是乱码的。

同时我们需要注意:当你试图进行一个序列化的操作时,你的对象需要实现Serializable这个接口

附上代码:

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SerializationExample{
   public static void main(String[] args) throws IOException{
       //创建学生集合
       List students = new ArrayList<>();
       Collections.addAll(students, new Student("Alice", 20), new Student("Bob", 22), new Student("Charlie",24));
       try (FileOutputStream fos = new FileOutputStream("person.bin");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            ObjectOutputStream oos = new ObjectOutputStream(bos)) {
           oos.writeObject(students);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }

       List temp =null;
       //反序列化
       try(FileInputStream fis = new FileInputStream("person.bin");
           BufferedInputStream bis = new BufferedInputStream(fis);
           ObjectInputStream ois = new ObjectInputStream(bis);
           ){
           temp = (List)ois.readObject();
           for(Student s : temp){
               System.out.println(s.getName()+" "+s.getAge());
           }
       } catch (ClassNotFoundException e) {
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

 

import java.io.Serializable;

public class Student implements Serializable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

 

你可能感兴趣的:(java,前端,开发语言)