Java基础之——IO流(字符流、转换流、缓冲流)

字符流原理

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();
	}
}

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象.

猜你喜欢

转载自blog.csdn.net/he_zhen_/article/details/87858637