Java:字符流,转换流,对象操作流


在这里插入图片描述

字符流:

使用字节流处理字符的问题

1、使用字节流写字符
可以使用,但是需要先把字符串转成字节数组,再存储到文件中,比较麻烦
2、使用字节流读取字符
如果是纯英文,可以一次读取一个字节
如果是纯中文,可以一次读取两个字节(GBK)
如果是中英文混杂,每次不知道读取多少个字节,因此无论字节数组准备多大,都会出现乱码
解决方案
1、出现乱码的原因:
每次不知道读取多少个字节,转换成字符。
而我们在代码中将每次读取的字节个数写死了。
2、解决:
动态判断每次应该读取多少个字节
在GBK编码表中,如果是一个英文,那么一定读取到的字节是正数,如果读取到的字节是正数,那么就可以断定是英文字符,就读取一个字节转成字符即可
在GBK编码表中,如果是一个中文,那么就一定读取到的第一个字节是负数,如果读取到一个负数,就说明读到的是一个中文,就需要再次读取一个字节,两个字节一起转成字符。
3、说明:
如果在工程中频繁做这么底层的操作,太复杂,直接使用jdk中已经提供好的解决方案
字符流:不仅能动态判断GBK的每个字符是中文还是英文,还可以判断其他编码表的所有语种

字符流的使用

1、抽象顶层父类:Reader、Writer
2、常用方法:
Reader:
read():读取一个字符,返回值如果是-1,表示到达文件的末尾
read(char[] arr):将一堆字符存储到一个字符数组中
Writer:
write(int c):写出一个字符
write(String str):写出一个字符串
write(char[] arr):将一个字符数组的所有内容写出
write(char[] arr, int offset, int len):将字符数组的一部分写出到目标中
arr:字符存储的容器
offset:从哪个位置开始
len:写出多少个

字符流的拷贝

在这里插入图片描述

字符流是否可以操作流媒体文件

在这里插入图片描述

字符流使用小数组拷贝

在这里插入图片描述

高效缓冲字符流

在这里插入图片描述

高效缓冲字符流的特有方法

在这里插入图片描述
在这里插入图片描述
需求:
键盘录入一个文件路径,将该文件反转
反转:第一行变成最后一行,第二行变成倒数第二行、、、、
例如:源文件
1234
5678
9ABC
目标文件
9ABC
5678
1234
在这里插入图片描述

转换流

1、GBK:国标码,定义的是英文字符和中文字符。在GBK编码表中,英文字符占一个字节,中文字符占两个字节。
2、UTF-8:万国码,定义了全球所有语言的所有符号,定义了这些符号和数字的对应关系,英文字符使用一个字节进行存储,中文字符使用三个字节进行存储
在这里插入图片描述

对象操作流

对象输入流:


5、注意事项:
1、要存储到文件中的对象,所属类型必须实现java.io.Serializable接口
2、对象存储到文件时,没有经过编码也没有经过解码,直接将字节信息存储到文件中;使用文本编辑器打开这个文件,相当于是做了解码操作,所以一定是乱码。将来这个文件就不应该使用文本编辑器打开,也不应该给人阅读,而是用于将来使用输入流读取的内容

对象输入流

在这里插入图片描述

注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、版本号问题:
Exception in thread “main” java.io.InvalidClassException: com.ujiuye.demos.Student; local class incompatible: stream classdesc serialVersionUID = 384528848059540731, local class serialVersionUID = 2430787247088292168
意思:修改了本地的Student类型,新的类型和文件中对象的类型已经不一致,所以两个版本冲突了,标志就是两个版本的序列化版本id不同
解决:不要使用自动生成的序列化版本ID,手动给定一个序列化版本ID,将来这个类型是否发生了版本变化,主要取决于程序员是否手动修改了这个类型的版本ID,如果修改了,那么文件中的对象类型和本地类型就不兼容,如果没有修改这个版本ID,那么无论怎样修改了类型内容,都可以做到文件对象类型和本地类型兼容。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值