文字数:约2100字 阅读时间:30分钟
为了方便程序员操作文本文件专门定义了一个字符流体系,顶层分别为Reader(字符输入流)和Writer(字符输出流)
字符流=字节流+编码表
1.2.1介绍
其实就是生活中字符和计算机二进制的对应关系表。
就是人为规定的一张数字与符号相互对应的表,可以让计算机识别人类的语言
1.2.2编码表
1、ascii: 一个字节中的 7 位就可以表示。对应的字节都是正数。0-xxxxxxx
2、iso-8859-1:拉丁码表 latin,用了一个字节用的 8 位。1-xxxxxxx 负数。
3、GB2312:简体中文码表。包含 6000-7000 中文和符号。用两个字节表示。两个字节都是开头为 1 ,两个字节都是负数。
4.GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0
5、GB18030:最新的中文码表,目前还没有正式使用。
6、unicode(万国码表):国际标准码表:无论是什么文字,都用两个字节存储。
7、UTF-8:基于 unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到 api 中查找)。
UTF-8中使用的是三个字节表示一个汉字
1.3.1 介绍
能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。
文字--->数字:(编码)
就是看能看懂内容,转换成看不懂的内容。
数字--->文字 : (解码)
是把看不懂的内容,转换成看懂的内容。
乱码:文件本身没有乱码,乱码只是一种解码解错误的现象(解码的时候用的编码表与当初写内容的时候用的不一样)
1.4.1 介绍
类似于Java中的一个变量,代表本地编码格式
1. 字节输入流 InputStream 抽象类
FileInputStream 操作文件的字节输入流
BufferedInputStream 操作文件的字节输入流
2. 字节输出流 OuputStream 抽象类
FileOutputStream 操作文件的字节缓冲输出流
BufferedOutputStream 操作文件的字节缓冲输出流
1. 字符输入流 Reader 抽象类
FileReader 用来操作文件的字符输入流(简便的流)
操作字符的便捷类,默认使用系统编码读取文件的内容
Reader的子类是InputStreamReader,FileReader是InputStreamReader的子类
BufferedFileReader 用来操作文件的字符缓冲输入流
2. 字符输出流 Writer 抽象类
FileWriter 用来操作文件的字符输出流(简便的流)
操作字符的便捷类,默认使用系统编码写入文件的内容
Writer的子类是OutputStreamWriter,FileWriter是OutputStreamWriter的子类
BufferedFileWriter 用来操作文件的字符输出流
转换流属于字符流的体系,按照方向可以分为输入转换流和输出转换流
转换流的特点是可以让程序员参与编码的控制
2.2.1 介绍
是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。
2.2.2 构造方法
InputStreamReader(InputStream in, String charsetName) :创建使用指定字符集的 InputStreamReader。
2.2.3 与字符输入流使用方法一致
2.3.1 介绍
是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。
2.3.2 构造方法
OutputStreamWriter(OutputStream out, String charsetName) :创建使用指定字符集的 OutputStreamWriter。
2.3.3 与字符输出流使用方法一致
将Java程序运行期间的对象,保存到硬盘上的过程,称为序列化
将硬盘上的文件中保存的对象,读取到Java程序中的过程,称为反序列化
3.2.1 序列化流ObjectOutputStream
1. 介绍
用于从流中读取对象的操作流
2. 构造方法
ObjectInputStream(InputStream in) :创建从指定 InputStream 读取的 ObjectInputStream。
3. 成员方法
writeObject(Object obj) :将指定的对象写入 ObjectOutputStream。
4. 注意事项
被写的对象,必须实现Serializable这个接口,否则报错
建议一个文件中只写一个对象
被写的对象的成员变量如果是引用数据类型也必须实现Serializable接口
3.2.2 反序列化流ObjectInputStream
1. 介绍
用于向流中写入对象的操作流
2. 构造方法
ObjectOutputStream(OutputStream out) :创建写入指定 OutputStream 的 ObjectOutputStream。
3. 成员方法
readObject() :从 ObjectInputStream 读取对象。
4. 注意事项
readObject方法当读不到对象的时候会抛出异常(可以用这个特性完成一个文件多个对象的读取)
3.2.3过程
序列化时,是将通过类创建的对象的信息封装到一个文件中去
反序列化时,是将文件中的信息通过类再重新创建出一个新的对象,然后返回给调用者
使用关键字transiert修饰一个成员变量时,该成员变量的值将不会被序列化
使用static修饰的成员变量,也不会被序列化
当类序列化之后,不能修改对象的类的成员,否则读取的时候会抛出异常。解决方法
可以在类中添加一个常量来固定类的版本号即可解决这个问题
格式为:static final long serialVersionUID = 1L;
打印流 添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
4.2.1字节打印流 PrintStream
1. 介绍
PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。(所见即所得)
2. 特点
永远不会抛出IO异常
属于OutputStream的孙子类
3. 构造方法
PrintStream(File file) :创建具有指定文件的新打印流。
PrintStream(File file, String csn) :创建具有指定文件名称和字符集的新打印流。 (csn:编码表名称)
PrintStream(OutputStream out) : 创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) :创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding) :创建新的打印流。
PrintStream(String fileName) :创建具有指定文件名称新打印流。
PrintStream(String fileName, String csn) :创建具有指定文件名称和字符集的新打印流。
4. 常用成员方法
print(Object obj) :打印对象。
println(Object x) :打印 Object,然后终止该行(换行)
打印流功能很强大,可以替换前面所有的输出流的功能
4.2.2 字符打印流 PrintWriter
1. 介绍
向文本输出流打印对象的格式化表现形式
2. 构造方法
PrintWriter(File file) :使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(File file, String csn) :创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter(OutputStream out) :根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) :通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(String fileName) :创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter(String fileName, String csn) :创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out) :创建不带自动行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) : 创建新 PrintWriter。
3. 常用成员方法
print(Object obj) :打印对象。
println(Object x) :打印 Object,然后终止该行(换行)
4. 与PrintStream的区别
a. 在操作字符方面.PrintWriter比PrintWriter更加强大
b. PrintWriter不能对字节文件进行操作(例如:图片,音乐,视频等)