今日份代码,解决 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);
} }

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

  1. mysql 事务队列 写入 幂等性 重复写入

    mysql  事务队列   写入 幂等性  重复写入

  2. 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream

    package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...

  3. Java 之 ObjectInputStream 类

    ObjectInputStream 类 1.概述 java.io.ObjectInputStream extends InputStream ObjectInputStream 反序列化流,将之前使用 ...

  4. java.io.ObjectInputStream类详解

    1.public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants分析 ...

  5. java ObjectOutputStream

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  6. eclipse 编译出错(java.io.ObjectInputStream)的解决办法

    Multiple markers at this line - The type java.io.ObjectInputStream cannot be resolved. It is indirec ...

  7. java.io.EOFException java.io.ObjectInputStream$PeekInputStream.readFully 错误

    Tomcat 启动时 java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully 错误 这 个错误 碰到好几 ...

  8. java使用ObjectInputStream从文件中读取对象

    import java.io.EOFException;import java.io.FileInputStream;import java.io.FileNotFoundException;impo ...

  9. JAVA–利用Filter和session防止页面重复提交

    JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览 ...

随机推荐

  1. H5 的直播协议和视频监控方案

    H5 的直播协议和视频监控方案 一.流媒体主要实现方式 二.流媒体技术 2.1 流媒体 2.2 直播 2.3 流协议 2.3.1 HLS 协议 2.3.2 RTMP 协议 2.3.3 RTSP 协议 ...

  2. 报表生成工具ireport

    最近又开始学习新的玩意儿了,扒拉扒拉网上的资源,先捣鼓个思维导图.

  3. CCDictionary 用调试器查看问题

    if(dic->objectForKey("uid")) uid = dic->valueForKey("uid")->getCString( ...

  4. centos6.5 更新python2.6.6至2.7.6

    1.查看当前Python版本    # python -V      Python 2.6.6  2.下载Python2.7.6源码    # wget http://python.org/ftp/p ...

  5. Git实践笔记(二)

    前一篇中说完了本地仓库的一些操作,本篇将继续进行撤销修改和删除的操作,以及远端仓库的设置.提交.克隆. 撤销修改和删除 现在在test.txt文件里面增加一行,内容为add error msg,先通过 ...

  6. IntelliJ IDEA 内置数据库管理工具实战

    1. 写在前面 开发Java应用程序,作为明星工具IntelliJ IDEA Ultimate当然是首选,然后进行数据库SQL开发的时候,常常会选择诸如:Navicat , sqlyog, MySQL ...

  7. 动态代理+静态代理+cglib代理 详解

    代理定义:代理(Proxy):是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 动态代理+静态 ...

  8. Nestjs 路程 之 异常过滤器Exceptionfilter

    参考文档:docs.nestjs.cn 说起Nestjs的异常过滤器,不能不提.Net的全局过滤器Filter,功能那是相当的强悍,用理论话说叫AOP 面向切面编程,可谓方便了太多需要异常处理的场景. ...

  9. JVM之JVM体系结构

    JVM是运行在操作系统之上的,它与硬件没有直接的交互 下图运行时数据区灰色代表线程私有,亮色(方法区和堆)代表所有线程共享. 1.类装载器ClassLoader 负责加载class文件,class文件 ...

  10. Educational Codeforces Round 21

    Educational Codeforces Round 21  A. Lucky Year 个位数直接输出\(1\) 否则,假设\(n\)十进制最高位的值为\(s\),答案就是\(s-(n\mod ...