五、对象专属流

    ObjectInputStream

    ObjectOutputStream

    把流的操作跟Java对象连接起来,主要用于对象的序列化和反序列化

    (1)序列化和反序列化的定义:

    1. - Java序列化就是指把Java对象转换为字节序列写到硬盘的过程
    2. - Java反序列化就是指把字节序列恢复为Java对象从硬盘读取的过程。

    (2)序列化最重要的作用:在传递和保存对象时保证对象的完整性和可传递性。对象转换为有序字节流,以 便在网络上传输或者保存在本地文件中。
    反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
    总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)

    ps:想要一次性序列化多个对象需使用集合,将对象添加到集合中,一个个序列化是不行的。

    只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。

    Serializable :序列化接口,是一个标志性接口,里面没有方法。
    序列化版本号 :实现Serializable接口后,会生成序列化版本号,做标识作用,用以区分Java类。

    如果进行序列化,此时生成一个序列化版本号,代码确定后不能进行后续的修改。因为反序列化会先编译,修改之后进行编译会生成新的序列化版本号,java虚拟机会认为这是一个全新的类。
    所以建议自定义序列化版本号,将序列化版本号写死。

    声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据

    1. private transient String age;

    1、ObjectOutputStream

    1. /**
    2. * 对象流:把流的操作跟Java对象连接起来
    3. * 主要用于对象的序列化和反序列化
    4. */
    5. public class IOTest08 {
    6. public static void main(String[] args) {
    7. try {
    8. //创建序列化对象
    9. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("userFile"));
    10. User user1 = new User("柿","123");
    11. User user2 = new User("子","123");
    12. User user3 = new User("牛","123");
    13. User user4 = new User("啊","123");
    14. ArrayList<User> users = new ArrayList<>();
    15. users.add(user1);
    16. users.add(user2);
    17. users.add(user3);
    18. users.add(user4);
    19. //序列化对象
    20. objectOutputStream.writeObject(users);
    21. objectOutputStream.flush();
    22. objectOutputStream.close();
    23. } catch (IOException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. }

    2、ObjectInputStream

    1. public class IOTest09 {
    2. public static void main(String[] args) {
    3. try {
    4. //创建反序列化对象
    5. ObjectInputStream userFile = new ObjectInputStream(new FileInputStream("userFile"));
    6. ArrayList<User> o = (ArrayList<User>)userFile.readObject();
    7. for (User user : o) {
    8. System.out.println(user);
    9. }
    10. } catch (IOException e) {
    11. e.printStackTrace();
    12. } catch (ClassNotFoundException e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }

    六、文件类(File类)
    文件和目录路径名的抽象表示,即既可以表示文件也可以表示文件目录路径
    https://blog.csdn.net/weixin_43683536/article/details/89498287

    1. public class IOTest10 {
    2. public static void main(String[] args) {
    3. //创建file对象
    4. File file = new File("io01.txt");
    5. //判断是否是文件
    6. System.out.println(file.isFile());
    7. //判断是否是绝对路径
    8. System.out.println(file.isAbsolute());
    9. //获得文件的路径
    10. System.out.println(file.getPath());
    11. //获得文件的父级目录
    12. System.out.println(file.getParent());
    13. //创建文件的方法
    14. //public boolean createNewFile();
    15. File file1 = new File("E:\\Temp\\io03.java");
    16. file1.createNewFile();
    17. System.out.println(file1.isAbsolute());
    18. System.out.println(file1.getParent());
    19. System.out.println(file1.getParentFile());
    20. //创建多级目录
    21. File file2 = new File("E:/a/b/c");
    22. boolean mkdirs = file2.mkdirs();
    23. System.out.println(mkdirs);
    24. //获取一个路径下的所有文件
    25. File file3 = new File("E:\\Temp");
    26. File[] files = file3.listFiles();
    27. for (File file4 : files) {
    28. System.out.println(file4.getAbsolutePath());
    29. }
    30. }
    31. }

    与文件相关的map集合:Properties

    1. public class IOTest11 {
    2. public static void main(String[] args) {
    3. FileReader fileReader = null;
    4. //创建一个输入流对象
    5. try {
    6. fileReader = new FileReader("io01.txt");
    7. //之前学过的一个map集合
    8. Properties properties = new Properties();
    9. //将流加载进properties
    10. properties.load(fileReader);
    11. //根据key获取value
    12. String username = properties.getProperty("username");
    13. String password = properties.getProperty("password");
    14. System.out.println(username);
    15. System.out.println(password);
    16. } catch (FileNotFoundException e) {
    17. e.printStackTrace();
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. } finally {
    21. try {
    22. fileReader.close();
    23. } catch (IOException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. }
    28. }