2、字符流
2.1字符流
为什么出现字符流?
一个字符经过编码后可能占用不同的字节数,字符和字节不是一一对应的关系,编码后的字符有可能变成数量不等的字节
使用字节流在操作文本文件的时候不是很方便,不能准确控制到底多少个字节对应一个字符?
所以Java提供了专门用来操作字符的字符流(所以字符流只针对文本文件)
能准确的从流中 获取/放入 字符
2.2字符集(编码方案)charSet
ASCII:美国标准委员会制定,用一个字节的7位表示一个字符 ISO8859-1:欧洲,拉丁编码,用一个字节的8位表示一个字符 GBK:中文编码,用两个字节表示一个中文字符 GB2312:GBK的升级版本,拥有更多的字符 GB18030:GBK取代版本,但使用不是很广泛 BIG-5:繁体字的编码 Unicode:国际标准码,绝大多数的字符使用两个字节编码,称为Unicode编码 UTF-8:一种Unicode编码实现方案,当程序中出现的字符需要写到硬盘上的文件,或者通过网络传输时,需要指定编码方案,并由此方案将字符编成具体的字节 特点:是一种变长的编码方案,编码后的字符有可能占用1-4个字节: 英文占一个字节,中文一般占用三个字节
2.3流的转换
转换流:OutputStreamWriter
字节流 到 字符流 的一种桥梁,
可使用指定的字符集将要写入流中的字符编码成字节
操作的数据单位是:字符
将对字节的操作转换成对字符的操作
本质上也是一种包装流,读写数据是通过底层的流实现的
构造方法:
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter
OutputStreamWriter(OutputStream out,String charsetName)
创建使用指定字符集的 OutputStreamWriter
void write(int b)
写一个字符
void write(String str)
写一个字符串
void write(String str,int off,int len)
写一个字符串一部分
void write(char[] ch)
写一个字符数组
void write(char[] ch,int off,int len)
写一个字符数组一部分
转换流:InputStreamReader
从字节流中读取数据,根据指定的字符集解码成字符
构造方法:
InputStreamReader(InputStream in)
用默认字符集创建转换流
InputStreamReader(InputStream in,String charsetName)
用指定字符集创建转换流 charsetName:”gbk” “utf-8”···
读取数据:
int read()
读取单个字符 读到没有返回-1
int read(char[] ch)
读取字符,并放入一个字符数组 读到没有返回-1
练习
转换流练习:文本文件复制 1.将当前项目路径下的a.txt复制一份为b.txt 2.将c:/name.txt复制到当前项目路径下 要求使用两种方式实现读写文件 一次读取一个字符 一次读取一个字符数组
2.4 转换流的简化类:FileWriter FileReader
在使用转换流过程中发现,平时操作都是在本地平台上操作,完全没有必要指定字符集,
而转换流的名字太长,所以Java提供了转换流的简化子类,方便那些使用默认字符集的场景
FileWriter
OutputStreamWriter类的简化类,默认使用平台默认字符集
FileReader
InputStreamReader类的简化类,默认使用平台的默认字符集
这两个类的方法基本和它们的转换流父类相同。