3.8 Java之对象流

对象流

  • 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象
  • 二进制流:以字节形式存储
  • 简而言之:将内存中的Java对象以流的形式或序列化形式转化成一个二进制流,将此二进制流存储或在网络上传输

  • 变量分为基本数据类型和引用数据类型
  • 数据流处理基本数据类型以及字符串和字符数组(8+2)
  • 对象流处理引用数据类型,即对象

  • 对象在程序运行时在内存中开辟和分配空间
  • 本质是内存中的对象与硬盘中的对象的转化,涉及到对象的序列化机制

实例

这里写图片描述

  • 接口功能:表明可序列化
  • 所有的属性所对应的类也要实现序列化,包括成员变量为类对象的属性,即所有的所有的属性都要可序列化
  • 若某属性采用static修饰,则仍然能序列化,但相应属性读不出,如name,age显示为null
  • UID:地址版本序列号,若写入时未显式声明该地址号,则自动分配,导致对象存储的硬盘位置可能改变,若想修改类的源代码后,同一对象 ,位置仍然不变,所以一定要显式指明该值

对象流输出

这里写图片描述
这里写图片描述

  • writeObject后flush清空一下
  • 对象输出流要对应一个文件,形参为节点流
  • 相当于把对象转化为字节数组(打包成二进制流了),从而保存到硬盘上

对象流输入

这里写图片描述

  • 对象类型强转
  • 另外机器上有person类,读取文件,才能组装成person类对象(无关紧要)

随机存取文件流

这里写图片描述

  • 一种特殊的流,既可充当输入流也可充当输出流
  • 随机存取文件流对象的模式,决定流的输入输出类型
  • rw表示既可输入也可输出
  • 元数据:对数据修饰的东西(参见:元注解的章节)

文件整体读写

这里写图片描述
这里写图片描述

  • 要进行读写,首先要用构造器创建随机存取文件流的对象,指明读写模式
  • 一个对象充当输入,一个对象为输出,读写模式用字符串形式表明
  • r表示只读,若写入只读文件则报输入输出异常

覆盖

这里写图片描述

  • abcdefg—->abcxyfg
  • seek方法从0开始,从位置3开始覆盖
  • 方法write实质是覆盖,而不是插入
  • 本质上底层还是和数组一样,改变/覆盖对应位置的值,不是插入

插入(简单情况)

这里写图片描述

  • 先把后面部分存到字符串中,再执行对应位置覆盖,再连接刚才保存的字符串,等到插入效果
  • 移动指针,以字节数组形式写入(只有此形参类型)
  • 注释处为查看指针位置的方法
  • 存在问题:若文件为多行,则换行符被替换,后一行自动和前一行相连接,若下图所示

执行结果

初始文件
这里写图片描述
执行程序后
这里写图片描述

插入(完备情况)

这里写图片描述

  • 能处理多行文件
  • 相对简单情况,改进了保存后面部分的方法,不再是读取一行,而是利用动态字符串,采用循环依次读取后面的内容,再通过动态字符串的append方法连接起来,最后用动态字符串的ToString方法转化为String,再转化为字节数组,最终写入文件,其余操作同简单情况。
  • 思想类比简单情况

I/O流总练习

方法类

这里写图片描述

  • 创建类的方法:从键盘上获取对应类型数据,类似Scanner的nextXX()方法
  • 利用字符串和包装类的转化,利用写好的获取字符串的方法,若传入int类型的值,调用parseXX方法,将字符串转化为对应类型的包装类,从而返回
  • System.in:返回InputStream的实现类对象(字节流),输入型
  • System.in(输入型)默认是字节流,要转化为字符流(使用转换流)
  • isr是Reader类的子类的对象,可进行再包装,传入BufferReader构造器中

测试类

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值