今日份代码,解决 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. MySQL常见优化

    MySQL常见优化 1.操作符优化 1.1<> 操作符(不等于) 1.2LIKE优化 1.3in,not in,exists与not exists 1.3.1in和exists 2.whe ...

  2. Spark Dataset DataFrame 操作

    Spark Dataset DataFrame 操作 相关博文参考 sparksql中dataframe的用法 一.Spark2 Dataset DataFrame空值null,NaN判断和处理 1. ...

  3. Cookie (设置与读取、超时设置、指定路径、显示用户上次登录时间)

    Cooike简介 Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的 ...

  4. Centos7 安装RabbitMQ 3.6.1

    如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...

  5. Cisco静态路由

    怎样让身在两个网段的终端会话交流呢?我们借用Cisco packet研究一下Cisco静态路由. 名词解释: 网关:(Gateway)网间连接器,或叫协议转换器:举例(参考https://baike. ...

  6. BZOJ1396 识别子串【SAM+SegmentTree】

    BZOJ1396 识别子串 给定一个串\(s\),对于串中的每个位置,输出经过这个位置且只在\(s\)中出现一次的子串的最短长度 朴素的想法是,我们要找到那些只出现一次的子串,之后遍历每个串,把串所覆 ...

  7. CodeForces - 220B 离散化+莫队算法

    莫队算法链接:传送门 题意: 有n个数,m个区间.问区间内有多少个x,x满足x的个数等于x的值的个数(如果x是3,区间内要存在3个3). 题解: 因为a[i]太大,所以要离散化一下,但是不能用map容 ...

  8. Python基础--核心数据类型

    python的核心数据类型: Number 数字(整数,浮点数,复数,布尔型数) String 字符串 List 列表 Tuple 元组 Dictionary 字典 Set 集合 1. 整数(整型数) ...

  9. Dubbo和SpringCloud的优劣势比较--总体架构

    从整体架构上来看 二者模式接近,都需要服务提供方,注册中心,服务消费方.差异不大.详见下方: Dubbo Provider: 暴露服务的提供方,可以通过jar或者容器的方式启动服务 Consumer: ...

  10. Leetcode(13)-罗马数字转整数

    罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列 ...