blog 2019.3.19 Day18 字符流

本文详细介绍了Java中的字符流,包括字符集、字符编码、Reader和Writer的使用,如FileReader、BufferedReader以及如何在字符流和字节流间选择。此外,还探讨了对象的序列化和反序列化过程,强调了序列化接口、transient关键字和静态变量在序列化中的作用。
摘要由CSDN通过智能技术生成

字符流

遇到传输中文的时候,字符流一次只能传递可以一个字符,但是中文在系统中占了两个字节,这里就引入了字符流。字符流的出现是为了解决文件、文本内的内容。

字符流是以字符(char)为单位来进行传输的,采用16位unicode编码(仅在java中),表示字符和字符串。
字符流分为两种:
字符输入流:Reader
字符输出流:Writer
两个流的共同特点:都是抽象类,用的时候要用他们的子类来完成。

字节流是以字节为单位来传输的,在开发过程中若遇到超过1个字节(比如中文或有的符号占2个字节),只能把字符拆开来读取,不方便且易数据丢失。字符流可以一次传递2个字节,解决了很多问题。

字符集

字符集:规定了某个文字他对应的二进制的存放/转换方式(转码/编码) 和某个二进制值代表了哪个文字(解码)的转换关系

字符编码

计算机只能存放0或者1二进制的数据,怎么样才能让他表示多种多样的数据?
我们要对各种字符指定一个数字编码,这种编码就是编码集。

输入 小王----->转换成字符编码------>转换成二进制 存储

a ----- 54992(GB2312 字符编码) -------- 97(ASCII码)
用什么样的编码进行转码的 就用什么样的编码进行解码,不能乱用。
在这里插入图片描述
例:字符的转码、解码。
在这里插入图片描述
在这里插入图片描述

计算机中常用的编码:GBK 、GB2312 、utf-8 、 unicode编码。

计算机中只保存字符对应的编码,计算机只需要维持字符集清单,当读到这种编码的时候,就拿去和清单进行对比,找出当前字符,然后再显示成我们看到的字符样式。

乱码:编码和解码所用的编码格式不一样。

Reader和Writer

InputStreamReader 转换流:把字节流转换成字符流来操作

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

读取数据

FileReader

在这里插入图片描述

BufferedReader

在这里插入图片描述

FileWriter

在这里插入图片描述

怎么选择?字符流还是字节流?

针对文件传输,一般选用字节流。比如:图片、音频、视频
针对文本传输,一般选用字符流。因为文本里面可能涉及到中文

用字节流操作文本内容没问题,如果是整体传输,可以传递。用字符流来操作文件可能会出现字节丢失,文件打不开。

对象的操作

在这里插入图片描述

对象的序列化

对象的序列化指的是将object对象转化为byte为单位的序列内容 传输到目的地(磁盘、网络空间)

对象的反序列化

将磁盘中的数据以byte单位读取,转化为object对象放入内存。


创建对象的三种途径:1、new 2、clone(克隆) 3、反序列化


序列化的规范:
1、你要序列化必须要实现Serializable接口(序列化接口的规范,虽然里面啥都没有,但是还要有这个接口)。如果说对象没有实现接口,序列化的时候,会抛出一个没有实现接口的异常。
2、静态变量和成员方法不可序列化。
3、一个类要被序列化,那该类引用的对象也应该是可以被序列化的。否则整个序列化过程将失败
4、声明transient关键字,可以控制当前属性不被序列化。

1、ObjectInputStream
2、ObjectOutputStream

Studentbean 标准学生对象 下面的toString有啥用

在这里插入图片描述


在这里插入图片描述
通过transient关键字,把序列化的对象读出来然后,进行反序列化,发现不影响transient关键字声明的对象。

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

静态变量也不会被序列化。

流操作的特性是:覆盖。
后面传输的数据默认将前面的数据给覆盖了

解决方法:调用构造的时候,传递了一个boolean值 true 表示追加信息到文本,false表示覆盖(不加就是默认false)。
在这里插入图片描述

读取的时候,若要取多个值,需要循环去取
在这里插入图片描述
发现问题!

存之前进行一系列操作
1、判断是否是第一次存,是的话把头信息存进去
在这里插入图片描述

第一次赋值,就只有一个 不需要加true

在这里插入图片描述
定义一个下标
在这里插入图片描述

以后加创建对象的时候需要加true 因为已经有一个了,不加true会覆盖。
在这里插入图片描述
每次在写内容到文件的时候,都会创建一个StringHeader 默认的头信息, 有四个字节,所以要减去
在这里插入图片描述

在这里插入图片描述

第一次存默认存头信息,第二次存不要存这个头信息了。 系统会默认都是同一个类,所以只能存一个。
写数据完毕。

读。
在这里插入图片描述

现在就可以找到两个学生对象了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值