• 【java】ObjectOutputStream & ObjectInputStream 多次写入发生重复写入相同数据的问题


    今日份代码,解决 ObjectOutputStream 多次写入发生重复写入相同数据的问题

    核心区别如下:

    package com.sxd.swapping.objoutputstream;
    
    import org.junit.Test;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.time.LocalDate;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     *  ObjectOutputStream 写对象到序列化文件中
     *  ObjectInputStream  读对象到反序列化文件中
     */
    public class SerializeTest {
    
    
        /**
         * 写生成序列化文件
         *
         * 对同一个 共享对象 做重复性的多次写入 建议使用writeObject + reset方法 组合使用 做重置动作 (即深克隆效果)下面这个 方法写入的 是 test1 test2  test3 三条。
         * 对于 非共享对象, 做多次重复性的写入  可以使用 writeUnshared 方法(即浅克隆效果)
         *
         *
         *
         * 而 单独使用 writeObject方法,会导致 第二次写入的对象 依旧是 第一次写对的对象。即 流不对被重置,导致下面这个 方法写入的 是错误的 test1 test2  test1  test2 四条。
         *
         * @throws Exception
         */
        @Test
        public void test3() throws Exception {
            List<Student> students = new ArrayList<>();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("C:/Users/ouiyuio/Desktop/students.ser")));
            for (int i = 1; i <= 3; i++) {
                Student student = new Student(i, "test" + i);
                students.add(student);
    
                if (students.size() >= 2) {
                    // objectOutputStream.writeUnshared(students);
                    objectOutputStream.writeObject(students);
                    objectOutputStream.reset();  //使用 reset保证写入重复对象时进行了重置操作
                    students.clear();
                }
            }
            if (students.size() > 0) {
                objectOutputStream.writeObject(students);
                objectOutputStream.flush();
            }
            objectOutputStream.writeObject(null);
            objectOutputStream.close();
        }
    
    
        /**
         * 反序列化读取文件内容
         * @throws Exception
         */
        @Test
        public void test4() throws Exception {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("C:/Users/ouiyuio/Desktop/students.ser")));
            List<Student> students = (List<Student>) objectInputStream.readObject();
            int count = 0;
            while (students != null) {
                count += students.size();
                for (Student student : students) {
                    System.out.println(student);
                }
                students = (List<Student>) objectInputStream.readObject();
            }
            objectInputStream.close();
            System.out.println(count);
        }
    
        @Test
        public void test5() throws Exception {
            int count = 0;
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("C:/Users/ouiyuio/Desktop/students.ser")));
            List<Student> students1 = (List<Student>) objectInputStream.readObject();
            count += students1.size();
            for (Student student : students1) {
                System.out.println(student);
            }
            List<Student> students2 = (List<Student>) objectInputStream.readObject();
            count += students2.size();
            for (Student student : students2) {
                System.out.println(student);
            }
            objectInputStream.close();
            System.out.println(count);
        }
    
    
    }
  • 相关阅读:
    项目的搭建步骤:
    MySQL复习笔记记录
    记录搭建SSM框架中常用到的功能:(监听器)、过滤器和拦截器 以及相关的拓展内容的学习记录
    为什么要配置spring**.xml或者applicationContext.xml --学习笔记
    java8 Lambda表达式学习笔记
    java多线程高并发学习从零开始——初识volatile关键字
    java多线程高并发学习从零开始——新建线程
    JVM工作机制以及异常处理之内存溢出OOM(OutOfMemoryError)/SOF(StackOverflowError)--Java学习记录2——更新中
    记录使用idea构建出现错误:failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9.1:jar——Java学习记录3
    Oracle创建用户和表空间的步骤 和 导入dmp文件的方法 —— 数据库学习
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/14412161.html
Copyright © 2020-2023  润新知