• Java IO--字符流--InputStreamReader 和 OutputStreamWriter


    今天继续学习字符流的子类!!!!

    先来熟悉一下适配器设计模式:(手写的,,嘿嘿)

    因为据说InputStreamReader 和OutputStreamWriter采用了适配器模式(现在我还没能理解,先记住)

    1 InputStreamReader

    是字节流转换成字符流的桥梁,使用指定的Chartset将将从底层读取的字节转换成字符返回到程序中,使用的字符集可以由名称指定或显示给定,或是默认字符集。本质使用其内部的一个类来完成所有工作:StreamDecoder、使用编码将字节转换成字符、InputStreamReader对StreamDecoder进行了封装、isr内部所有方法核心都是调用StreamDecoder来完成的。

    每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

    为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    1.1类图

    1.2 构造函数

    • InputStreamReader(InputStream in) 创建一个使用默认字符集的isr。
    • InputStreamReader(InputStream in, Chartset cs) 创建使用给定字符集的isr。
    • InputStreamReader(InputStream in, ChartsetDecoder dec) 创建使用给定字符集解码器的isr。
    • InputStreamReader(InputStream in, String chartsetName) 创建使用指定字符集的isr。

    1.3 代码示例

    public static void InputStreamReaderTest() throws IOException{
    		InputStream in = new FileInputStream("D:1.txt");
    		InputStreamReader isDefault = new InputStreamReader(in);
    		BufferedReader br = new BufferedReader(isDefault);
    		System.out.println("isDefault encoding :" + isDefault.getEncoding() + "----content:" + br.readLine());
    		if(in != null){
    			in.close();
    		}
    		if(isDefault != null){
    			isDefault.close();
    		}
    		if(br != null){
    			br.close();
    		}
    	}

    运行结果:

    把InputStreamReader isDefault = new InputStreamReader(in);

    改成:InputStreamReader isDefault = new InputStreamReader(in, ‘’UTF-8‘’);

    运行结果:

    2 OutputStreamWriter

    字符流通向字节流的桥梁,每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

    为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

    Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

    2.2 构造函数

    • OutputStreamWriter(OutputStream out) 创建使用默认字符编码的osw。
    • OutputStreamWriter(OutputStream out, Chartset cs) 创建使用给定字符集的osw。 
    • OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的osw。
    • OutputStreamWriter(OutputStream out) 创建使用指定字符集的osw。

    2.3 代码示例

    public static void outputStreamWriterTest() throws IOException{
    		OutputStream out = new FileOutputStream("D:1.txt", true);
    		OutputStreamWriter osw1 = new OutputStreamWriter(out);//默认编码
    		BufferedWriter bfw1 = new BufferedWriter(osw1);
    		bfw1.newLine();
    		bfw1.write("我");
    		
    		OutputStreamWriter osw2 = new OutputStreamWriter(out, "GBK");//GBK编码
    		BufferedWriter bfw2 = new BufferedWriter(osw1);
    		bfw2.newLine();
    		bfw2.write("我");
    		
    		OutputStreamWriter osw3 = new OutputStreamWriter(out, "UTF-8");//UTF-8编码
    		BufferedWriter bfw3 = new BufferedWriter(osw1);
    		bfw3.newLine();
    		bfw3.write("我");
    	
    		bfw1.flush();
    		bfw2.flush();
    		bfw3.flush();
    
    		bfw1.close();
    		bfw2.close();
    		bfw3.close();
    
    		osw1.close();
    		osw2.close();
    		osw3.close();
    		
    		out.close();
    	}

    运行结果:

    3 总结

    OutputStreamWriter、InputStreamReader分别为OutputStream、InputStream的低级输入输出流提供将字节转换成字符(或将字符转换成字节)的桥梁。

    OutputStreamWriter中的StreamEncoder:

    1、使用指定的或者默认的编码集将字符转码为字节

    2、调用StreamEncoder自身实现的写入方法将转码后的字节写入到底层字节输出流中。

    InputStreamReader中的StreamDecoder:

    1、使用指定的或者默认的编码集将字节解码为字符

    2、调用StreamDecoder自身实现的读取方法将解码后的字符读取到程序中。

    在理解这两个流的时候要注意:java-io中只有将字节转换成字符的类,没有将字符转换成字节的类,原因很简单——字符流的存在本来就像对字节流进行了装饰、加工处理以便更方便的去使用。在使用这两个流的时候要注意:由于这两个流要频繁的对读取或者写入的字节或者字符进行转码、解码和与底层流的源和目的地进行交互、所以使用的时候要使用BufferedWriter、BufferedReader进行包装、以达到最高效率、和保护存储介质。

  • 相关阅读:
    .Net Core实现下载多个文件并压缩打包
    VS上使用Docker调试编译net core项目时卡在 vsdbgvs2017u5 exits,deleting.
    spring boot actuator监控详细介绍
    数仓知识
    layui使用 弹窗 layer
    Spring配置数据源(连接池)
    Spring配置文件-引入其他配置文件(分模块开发import)&Spring相关API
    Spring配置文件-Bean标签配置
    事务的四大特征&事务隔离级别
    事务
  • 原文地址:https://www.cnblogs.com/teiba/p/8996503.html
Copyright © 2020-2023  润新知