字符流原理
Reader是所有字符输入流的父类,而Writer是所有字符输出流的父类,字符流是以字符(char)为单位读写数据的,一次处理一个unicode,字符流都是高级流,其底层都是依靠字节流读写数据。
Reader的常用方法
writer的常用方法
转换流
字符编码
计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。
字符编码(character Encoding):就是一套自然语言的字符与二进制数之间的对应规则。
常见的字符编码
ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx
iso-8859-1:一个字节表示一个字符:所有的8位都表示数据,xxxx xxxx 全部
用来表示字符数据
GB2312: 简体中文码表。包含6000-7000中文和符号。用两个字节表示。
两个字节第一个字节是负数,第二个字节可能是正数。
GBK: 目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中
的一部分文字,第一个字节开头是1,第二字节开头是0。
UTF-8: 基于unicode,一个字节就可以存储数据,不要用两个字节存储,
而且这个码表更加的标准化,在每一个字节头加入了编码信息
文字—>(数字) :编码: 就是把能看懂内容,转换成看不懂的内容。
例如:A ——> 65
(数字)—>文字 : 解码: 就是把看不懂的内容,转换成看懂的内容。
例如:65 ——> A
inputStreamReader
inputStreamReader是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
InputStreamReader的构造方法
InputStreamReader(“java.txt”,“GBK”)
创建使用指定字符集的 InputStreamReader
InputStreamReader(“java.txt”)
创建一个使用默认字符集的 InputStreamReader
OutputStreamReader
OutputStreamReader是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集讲字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
OutputStreamReader的构造方法
OutputStreamWriter(“java.txt”,“GBK”)
创建使用指定字符集的 OutputStreamWriter。
OutputStreamWriter(“java.txt”)
创建使用默认字符编码的 OutputStreamWriter。
总结:
字节—>字符 : 看不懂的—>看的懂的。 需要读。输入流。 InputStreamReader
字符—>字节 : 看的懂的—>看不懂的。 需要写。输出流。 OutputStreamWriter
缓冲流
flush()和close()的区别?
flush():将缓冲区内的数据刷新到目的地中,刷新后,流还可以继续使用。
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
缓冲流基本工作原理:
在向硬件装备做写出操作时,增大写出次数无疑也会降低写出效率,为此可以使用缓冲
流来一次性的批量写出若干数据
每当我们想该流写数据或读取数据时,都会将数据存入缓冲区,当缓冲区已满时,缓冲流
将数据一次性全部写出
BufferedOutputStream
将缓冲区的内容强制写出
public static void writeCN() throws Exception {
//创建与文件关联的字节输出流对象
FileOutputStream fos = new FileOutputStream("d:\\file.txt");
//创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//调用转换流,把文字写出去,其实是写到转换流的缓冲区中
bos.write('a');//并没有向磁盘写出,而是写到BOS缓冲区
bos.flush();//强制写出
bos.close();//实际上,close方法在执行前执行flush
}
BufferedInputStream
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//演示字节转字符流的转换流
readCN();
}
public static void readCN() throws IOException{
//创建读取文件的字节流对象
InputStream in = new FileInputStream("d:\\file.txt");
//创建转换流对象
//这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
//InputStreamReader isr = new InputStreamReader(in);
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//使用转换流去读字节流中的字节
int ch = 0;
while((ch = isr.read())!=-1){
System.out.println((char)ch);
}
//关闭流
isr.close();
}
}
注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象.