当前位置: 首页 > 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());

输出如下

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端大模型入门:掌握langchain的核心Runnable接口(一)
  • Redis---卸载Redis
  • LeetCode 876
  • Window Server 2019+ 安装 Docker
  • 【系统架构设计师-2014年真题】案例分析-答案及详解
  • muduo - 概要简述
  • 不抬头看路会回归那世
  • 数据结构-3.2.栈的顺序存储实现
  • 基于Python的自然语言处理系列(14):TorchText + biGRU + Attention + Teacher Forcing
  • 深入理解Go语言的方法定义与使用
  • sqli-lab靶场学习(二)——Less8-10(盲注、时间盲注)
  • 前端开发之迭代器模式
  • 从数据仓库到数据中台再到数据飞轮:我了解的数据技术进化史
  • 代码管理-使用TortoiseGit同步项目到Github/Gitee
  • 运行npm install 时,卡在sill idealTree buildDeps没有反应
  • #Java异常处理
  • 2017-08-04 前端日报
  • ES2017异步函数现已正式可用
  • Gradle 5.0 正式版发布
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js递归,无限分级树形折叠菜单
  • leetcode46 Permutation 排列组合
  • magento 货币换算
  • mongo索引构建
  • Netty 4.1 源代码学习:线程模型
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 大主子表关联的性能优化方法
  • 解决iview多表头动态更改列元素发生的错误
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 运行时添加log4j2的appender
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • C# - 为值类型重定义相等性
  • linux 淘宝开源监控工具tsar
  • python最赚钱的4个方向,你最心动的是哪个?
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # wps必须要登录激活才能使用吗?
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #前后端分离# 头条发布系统
  • (13)DroneCAN 适配器节点(一)
  • (52)只出现一次的数字III
  • (9)STL算法之逆转旋转
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (java)关于Thread的挂起和恢复
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读40-45)图像描述1
  • (一) storm的集群安装与配置
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***通过什么方式***网吧
  • *2 echo、printf、mkdir命令的应用