【Java学习笔记】InputStreamReader的理解

一、InputStreamReader类

API文档说明:InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率,请考虑在BufferedReader中包装InputStreamReader

如何理解InputStreamReader是字节流到字符流的桥接器?
1、计算机存储的单位是字节,如尽管txt文本中有中文汉字这样的字符,但是对计算机而言,其是字节形式存在的
2、如果使用字符流读取一个utf-8的文件,会默认使用gbk码表将其转换为字符
3、字节本质是8个二进制位,且不同的字符集对同一字节解码后的字符结果是不同的,因此在读取字符时务必要指定合适的字符集,否则读取的内容会产生乱码
4、 那么就需要一个流把字节流读取的字节进行缓冲而后在通过指定字符集解码成字符返回,因而形式上看是字符流
5、InputStreamReader流就是起这个作用,实现从字节流到字符流的转换
如何理解read()方法都可能导致从底层字节输入流中读取一个或多个字节?
read()方法会尝试尽量从底层字节流中读取2个字符到字符缓冲区中,注意这里是尽量,若遇到文件最后字符,则就只能读取到1个字符,因此每次read()方法读取的字节数是不定的
InputStreamReader类与FileReader类的关系
1、FileReader类仅仅是InputStreamReader的简单衍生并未扩展任何功能
2、FileReader类读取数据实质是InputStreamReader类在读取,而InputStreamReader读取数据实际是StreamDecoder类读取

如果还是不能理解“桥梁”,那么柔和一下OutStreamWriter。简而言之,OutStreamWritter – 将输出的字符流 ---- > 字节流 —> 用于输出到控制台 或者 文件 – 注意这个是写 ====输出的是来源,形容词,正常理解的字符输出流转字节输出流
InputStreamReade – 将输入的字节流 -----> 字符流 ---->用于读取到控制台 或 内存 – 注意这个是读 ====输入的是来源,形容词,正常理解的字节输入流转字符输入流

二、图例

【Java学习笔记】InputStreamReader的理解_第1张图片

三、代码示例

		//初级版
		//inputstream:将字节流转换为字符流的桥梁
		InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8");//使用指定码表
		//outputstream:将字符流转换为字节流的桥梁
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");
		
		int c;
		while((c = isr.read()) != -1) {
			osw.write(c);
		}
		isr.close();
		osw.close();
		//升级版
		BufferedReader br = 									//高效的用指定的编码表读
				new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "UTF-8"));
		BufferedWriter bw = 									//高效的用指定的编码表写
				new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "GBK"));
		int ch;
		while((ch = br.read()) != -1) {
			bw.write(ch);
		}
		
		br.close();
		bw.close();

你可能感兴趣的:(javase)