一,为什么会出现字符流
由于字节操作中文不是特别方便,所以Java就增加字符流
- 字符流= 字节流+编码表,字符流的底层还是字节流
用字节直接复制文本时,文本文件也会有中文,但是没有问题
,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文呢?
- 汉字在存储的时候,无论是选择哪种编码存储,第一个字节都是负数
二,编码表
基础知识
- 计算机存储的信息都是用二进制数表示的:我们屏幕上看到的中文,汉字等字符都是二进制数转换之后的结果
- 按照某种规则,将字符存储到计算机中,称为编码。反之,将计算机中的二级制数按照某种规则解析显示出来,称为解码。这里强调一下:按照A编码存储,就必须按照A编码解析,这样才能显示正确的文本符号,否则会出现乱码的情况
三,字符串中的编码解码问题
编码
- byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
- byte[] getBytes(String charsetName):使用指定的字符集将String编码为一系列字节,将结果存储到新的字节数组中
解码:
- String(byte[] byte):通过使用平台的默认字符集解码指定的字符数组来构造新的String
- String(byte[],String charsetName):通过指定的字符集编码指定的字节数组来构造新的String
三,字符流中的编码解码问题
字符抽象类
- Reader:字符输入流的抽象类
- Writer:字符输出流的抽象类
字符流中和编码解码问题相关的两个类
- InputStreamReader
- OutputStreamWriter
四,字符流写数据的5种方法
方法名 | 说明 |
---|---|
void write(char[] cbuf) | 写一个字符数组 |
void wirte(char[] cbuf,int off,int len) | 写入一个字符数组 |
void write(String str) | 写一个字符串 |
void wirte(String str,int off,int len) | 写入字符串的一部分 |
public void static main(String[] arge)
{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("CharStream\\osw.txt"));
//写入一个字符void wirte(int c);
ows.write(97);
//void flush():刷新流
ows.flush();
ows.write(98);
ows.flush();
ows.write(99);
//写入一个字符数组void wirte(char[] cbuf)
char[] chs={
'a','b','c',
'd','e'};
ows.write(chs);//读取全部
ows.write(chs,0,chs.length);//有选择地读取部分