javaIO-字符流

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类的简化类,默认使用平台的默认字符集

这两个类的方法基本和它们的转换流父类相同。

原文地址:https://www.cnblogs.com/wqbin/p/11240786.html