字符流
遇到传输中文的时候,字符流一次只能传递可以一个字符,但是中文在系统中占了两个字节,这里就引入了字符流。字符流的出现是为了解决文件、文本内的内容。
字符流是以字符(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 默认的头信息, 有四个字节,所以要减去
第一次存默认存头信息,第二次存不要存这个头信息了。 系统会默认都是同一个类,所以只能存一个。
写数据完毕。
读。
现在就可以找到两个学生对象了