一、概述
字符流,底层还是字节流,在使用字节读取字节数据后,会把两个或多个字节数据合并为一个编码值后,利用编码值去编码表中查找对应的字符。字符流=字节流+编码表
开发中,常见的编码表:
ASCII(美国):国际信息交换码。使用一个字节中的最低7位来存储 例:0-xxx xxxx(正数)
ISO-8859-1(欧洲):拉丁码表。使用一个字节来存储。包含了ASCII码 例:1xxx xxxx(负数)
B2312(中国):包含了6000多个中文字符。一个中文使用两个字节来存储 例:1 xxxxxxx 1xxx xxxx (负数)
GBK(开发中使用最多):gb2312的升级版。包含了20000多个中文符号。使用两个字节来存储。第一个字节是 负数,第二个字节是负数或正数。例:1xxx xxxx 1xxx xxxx或0xxx xxxx
GB18030:包含了简体中文、繁体、甲骨文、象形文
因为不同的国家都具有自己的编码表,在使用时因为编码表不统一,不方便。
世界计算机协会就统制定了一张编码表--国际标准信息码:
unicode:国际标准信息码。JDK内置了这张码表。char类型就是使用这张码表任何数据都是使用两个字节来存
UTF-8:unicode码表的升级版。在UTF-8码表中为每个编码都添加了标记码存储数据时,可以使用一个字节来 存储,也可以使用两个字节来存储,可也可以使用三个字节来存储
中文编码表:GBK、GB2312、GB18030、unicode、UTF-8
在开发中,经常使用的编码表:ISO-8859-1、GBK、UTF-8
二、字符输入流Reader
Reader:是字符输入流的父类
FileReader:用来从文件中读取字符的输入流
FileReader的构造方法:
FileReader(File file)
在给定文件对象file的情况下,创建字符输入流对象FileReader(String fileName)在给定文件名称的情况下,创建字符流对象FileReader的常用方法:
FileReader类中的方法全部都是来自于父类对象
read() 读取一个字符
read(char[] cbuf, int off , int length)读取多个字符,把读取到的字符数据存储char[]数组中,从off角标 开始取length长度
close()关闭字符输入流
在使用FileReader读取字符文件时,底层使用字节流把文件中存储的二进制数据读取,并暂存在FileReade内置的字节缓冲区中,在使用read时,就从内置缓冲区中一次读取两个字节数据,并且合并为一个编码值,再根据编码值去FileReader默认的编码表中查找对应的字符。
三、字符输出流Writer
Writer:是字符输出流的父类
FileWriter:用来向文件中写入字符的输出流
FileWriter构造方法:
FileWriter(File file) 根据给定的file对象创建字符输出流对象
FileWriter(String fileName)根据给定的文件名创建字符输出流对象
FileWriter(File file,boolean append)根据给定的file对象创建字符输出流对象,可以续写
FileWriter(String fileName,boolean append)根据给定的文件名创建字符输出流对象,可以续写
FileWriter常用方法:
FileWriter类中的方法都是来自父类Writer
write(charch) 一次写入一个字符
write(char[] cbuf, int off , int len)一次向文件中写入多个字符数据。把char[]数组中从off角标开始取len 长度个字符一次性写入
write(String str)把字符串写入到文件中
write(String str, int off , int len)
flush() 把字符输出流中内置缓冲区下的字节数据,写入到文件中
四 、转换流
在Reader和FileReader之间还有一个类:InputStreamReader
在Writer和FileWriter之间也有一个类:OutputStreamWriter
1.转换流的作用:
a.用来实现字节流和字符流之间的互相转换
b.使用转换流来读写指定字符集(编码表)文件
2.InputStreamReader:把字节流转为字符流的转换流构造方法:
InputStreamReader(InputStream in) 和FileReader一样使用默认编码表
InputStreamReader(InputStream in,String charsetName)可以指定编码表
3.OutputStreamWriter:把字符流转为字节流的转换流构造方法:
OutputStreamWriter(OutputStream out)使用默认的编码表
OutputStreamWriter(OutputStream out,String charsetName)可以指定编码表
4.注意:
a.转换流本身不具备读写功能,需要依赖于输入流,输出流来实现对文件的读写操
InputStreamReader:需要依赖FileInputStream输入流
OutputStreamWriter:需要依赖FileOutputStream输出流
b.在创建转换流时,必须给转换流指定的字符集(编码表)
当不给转换流指定字符集时,转换流的作用没有太大意义了。此和转换流读用FileReader、FileWriter没 有区别
五、字符流缓冲区
1.字符输入流缓冲区:BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符,数组和行的高 效读取
构造方法:
BufferedReader(Reader in):创建字符输入流缓冲区对象,默认大小为1024*8个字节
BufferedReader(Reader in,int sz):创建字符输入流缓冲区对象,并指定缓冲区大小
BufferedReader可以按照行来读取文件。方法:reader line()
2.字符输出流缓冲区:BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符 串的高效写入
构造方法:
BufferedWriter(Writer out) 创建字符输出流缓冲区对象,使用默认大小
BufferedWriter(Writer out,int sz)创建字符输出流缓冲区对象,并制定大小