- 为什么会出现字符流?
由于字节流操作中文不是特别的方便,所以Java就提供了字符流(字符流 = 字节流+编码表)
- 用字节流复制文本文件时,文本文件也有中文,但是没有问题,原因是最终底层会自动进行字节拼接成中文(汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数)
字符串中的编码解码问题
- 编码:
①byte[] getBytes();使用平台默认字符集将string编码为一系列字节,将结果存储到新的字节数组中。
②byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
- 解码:
①String(byte[] bytes):使用平台默认的字符集解码指定的字节数组来构造新的String。
②String(byte[] bytes,String charsetName):使用指定的字符集解码指定的字节数组来构造新的String。
字符流中编码解码的问题
- 字符流抽象基类
①Reader:字符输入流的抽象类
②Writer:字符输出流的抽象类
- 字符流中和编码解码问题相关的两个类
①InputStreamReader:是从字节流到字符流的桥梁,它读取字节,并使用指定的编码将其解码为字符。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
②OutputStreamWriter:是从字节流到字符流的桥梁,使用指定的编码将写入的字符编码为字节,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
- InputStreamReader构造方法
构造方法 |
说明 |
InputStreamReader(InputStream in) |
创建一个使用默认字符集的inputStreamReader |
inputStreamReader(InputStream in,String charsetName) |
创建一个使用命名字符集的InputStreamReader |
构造方法 |
说明 |
OutputStreamWriter(OutputStream in) |
创建一个使用默认字符集的OutputStreamWriter |
OutputStreamWriter(OutputStream in,String charsetName) |
创建一个使用命名字符集的OutputStreamWriter |
字符流写数据的5种方式
方法名 |
说明 |
void write(int c) |
写一个字符 |
void write(char[] chuf) |
写入一个字符数组 |
void write(char[] chuf,int off,int len) |
写入字符数组的一部分 |
void write(String str) |
写一个字符串 |
void write(String str,int off,int len) |
写一个字符串的一部分 |
方法名 |
说明 |
flush() |
刷新流,还可以继续写数据 |
close() |
关闭流,释放资源,但是在关闭之前会先刷新流,一旦关闭,就不能再写数据了 |
字符流读数据的2种方式
方法名 |
说明 |
int read() |
一次读一个字符数据 |
int read(char[] chuf) |
一次读一个字符数组的数据 |
FileReader与FileWriter(InputStreamReader和OutputStreamWriter的子类)
由于InputStreamReader和OutputStreamWriter使用起来名字太长,且构造方法还要创建一个FileInputStream和FileOutputStream对象,不够方便,所以使用FileReader和FileWriter,但是想要设置编码解码时,还是使用InputStreamReader和OutputStreamWriter
构造方法 |
说明 |
FileReader(String fileName) |
等价于InputStreamReader(new FileInputStream(String filename)) |
FileWriter(String fileName) |
等价于OutputStreamReader(new FileOutputStream(String filename)) |
网友评论