当前位置: 首页 > news >正文

java序列化对象后读取数据错误的问题

今天学到了对象的序列化,就是将对象写入到文件中去,大家要直到我们普通的输入输出文件只是把数据的值写入了文件,而没有把数据的类型与之绑定,比如我向文件中写入100,那么这是字符串”100“还是整数100还是高精度浮点数呢,我们是不能确定的,将数据的类型和值一起写入文件中,这就是序列化,把序列化的数据从文件中读出来,这就是反序列化

问题

学习过程中我试了试向文件中写和读,可是在读的时候却抛出了异常,测试代码如下

        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa.dat"));oos.writeObject(new Dog());oos.writeChar('a');oos.writeUTF("这是一个测试语句");ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa.dat"));System.out.println(ois.readObject());System.out.println(ois.readChar());System.out.println(ois.readUTF());

我是严格按照写进去的顺序来读的,还是提示我异常如下

 告诉我读不到目标数据,我就纳闷了,明明正常进去了怎么就读不出来呢,我去看目标文件里面也有我写入的数据啊怎么就读不到呢,试了半天找了半天bug才发现,我在写入文件之后没有关闭输入流,那么我想要写入的数据就还没有真正的进入文件

因为数据在写入时为了提高效率,通常都是把数据先放入缓冲区,等着调用输入流的close或者flush方法的时候会将缓冲区的数据真正送入文件。当然,如果忘了调用这些方法的话,一般在程序结束时系统会将数据真正写入文件中去

这就合理解释了这个问题:在写入命令执行完并且没有关闭输出流的时候数据还留在缓冲区中,并没有真的进入文件,此时我调用读命令读取数据系统则会发现文件是空的,自然就会抛出异常了。

像下面这样加上close方法后就可以正常输出了

        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa.dat"));oos.writeObject(new Dog());oos.writeChar('a');oos.writeUTF("这是一个测试语句");oos.close();//关闭输出流ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa.dat"));System.out.println(ois.readObject());System.out.println(ois.readChar());System.out.println(ois.readUTF());

输出如下

 


http://www.mrgr.cn/news/30452.html

相关文章:

  • 初学者笔记本电脑玩转大模型系列一:利用ollama跑大模型
  • Ceph官方文档_01_Ceph简介
  • C++ prime plus-4-编程练习
  • 【读书笔记-《30天自制操作系统》-22】Day23
  • 枚举(not二分)
  • 【移动端开发】“明日头条APP”
  • 【Java】网络编程-地址管理-IP协议后序-NAT机制-以太网MAC机制
  • [2025]基于微信小程序慢性呼吸系统疾病的健康管理(源码+文档+解答)
  • 预处理、makefile、静动态库编写、nfs挂载、快捷命令
  • 白酒与朋友聚餐:如何活跃气氛,增进感情?
  • 每日OJ题_牛客_除2!(贪心+堆)
  • 2024.9.19
  • 【C++算法】模拟算法
  • 【MySQL】表的相关操作
  • linux网络编程3
  • 项目实现:云备份服务端①(文件操作、Json等工具类实现)
  • 建设工程联合体的性质如何认定?
  • 【机器学习】经典数据集鸢尾花的分类识别
  • Yocto - 使用Yocto开发嵌入式Linux系统_01 前言
  • 模型训练时CPU和GPU大幅度波动——可能是数据的读入拖后腿