java基础之IO流(字节流字符流区别及转换、序列化)

一、IO流体系结构:

在这里插入图片描述

二、IO流分类
  1. 按数据流的方向:输入流、输出流
  2. 按处理数据单位:字节流、字符流
  3. 按功能:节点流、处理流
三、字节流和字符流的区别及转换

字节流和字符流:

  1. 字节流操作的单元是数据单元为8位的字节,字符流操作的单元是数据单元为16位的字符

  2. 字节流可以处理一切文件,而字符流只能处理纯文本文件

  3. 字节流本身没有缓冲区,而字符流本身就带有缓冲区

既然字节流可以处理一切文件,那为什么还要有字符流呢?

因为Java中字符是采用Unicode标准,Unicode 编码中,一个中文字符为两个字节,所以单个单个字节输出会产生乱码,因此需要用字符流操作一个一个的的字符,避免乱码。并且因为字符流自带缓冲区所以处理纯文本文件效率会更高。

(补充:在Unicode编码中所有字符都是两个字节;GBK编码中,中文字符占两个字节,英文字符占一个字节;UTF-8编码中,一个中文字符占3个字节,英文字符占一个字节。Unicode编码中对于英文字符高位字节补0,低位字节与ASCll码值相同,而对于GBK和UTF-8中的英文字符和ASCll码值相同)

Reader fr = new FileReader(“文件路径”);是怎么将文件转为字符流的?

在这里插入图片描述

将文件先通过new FileInputStream转换为字节流,然后通过super关键字调用父类InputStreamReader的构造方法,通过StreamDecode.forInputStreamReader把转换好的字节流转为字符流。

在这里插入图片描述
在这里插入图片描述

同理,new FileWriter也是如此。

四、缓冲流:

BufferInputStream,BufferReader。

程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。

普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互,通过提高每次交互的数据量,减少交互次数,从而提高性能。

五、打印流:

PrintStream(打字节),PrintWriter(打字符)

使用方便,高效(内部有缓冲流实现)

PrintStream ps = new PrintStream(new FileOutputStream(“路径”,true));//在原有管道实现数据追加功能。
直接对象ps .println()就可以将原有数据原封不动打印出来。
记得ps .close()关闭刷新!

system.out.println()的out也是PrintStream的对象。

六、序列化

用于持久化存储、跨平台存储和网络传输。跨平台存储和网络传输的数据格式是字节数组。

使用ObjectOutputStream对象字节输出流,将内存中的对象转为字节流。可以进行网络传输,也可以保存到硬盘中去(成为文件),实现对象持久化。再使用ObjectInputStream对象字节输入流进行反序列化。

注意事项:

1.序列化是信号,没有实现Serializable序列化接口会报错。

2.使用transient修饰的字段不会被序列化到文件中(保护重要数据如密码)

3.序列化版本号要保持一致,序列化版本更新了则必须先重新序列化一遍才能反序列化,否则会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值