今天继续学习字符流的子类!!!!java
先来熟悉一下适配器设计模式:(手写的,,嘿嘿)设计模式
由于听说InputStreamReader 和OutputStreamWriter采用了适配器模式(如今我还没能理解,先记住)函数
是字节流转换成字符流的桥梁,使用指定的Chartset将将从底层读取的字节转换成字符返回到程序中,使用的字符集能够由名称指定或显示给定,或是默认字符集。本质使用其内部的一个类来完成全部工做:StreamDecoder、使用编码将字节转换成字符、InputStreamReader对StreamDecoder进行了封装、isr内部全部方法核心都是调用StreamDecoder来完成的。学习
每次调用 InputStreamReader 中的一个 read() 方法都会致使从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,能够提早从底层流读取更多的字节,使其超过知足当前读取操做所需的字节。编码
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:spa
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
1.1类图设计
1.2 构造函数code
1.3 代码示例get
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(); } }
运行结果:it
把InputStreamReader isDefault = new InputStreamReader(in);
改为:InputStreamReader isDefault = new InputStreamReader(in, ‘’UTF-8‘’);
运行结果:
是字符流通向字节流的桥梁,每次调用 write() 方法都会致使在给定字符(或字符集)上调用编码转换器。在写入底层输出流以前,获得的这些字节将在缓冲区中累积。能够指定此缓冲区的大小,不过,默认的缓冲区对多数用途来讲已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了得到最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以免频繁调用转换器。例如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
2.2 构造函数
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(); }
运行结果:
OutputStreamWriter、InputStreamReader分别为OutputStream、InputStream的低级输入输出流提供将字节转换成字符(或将字符转换成字节)的桥梁。
OutputStreamWriter中的StreamEncoder:
一、使用指定的或者默认的编码集将字符转码为字节
二、调用StreamEncoder自身实现的写入方法将转码后的字节写入到底层字节输出流中。
InputStreamReader中的StreamDecoder:
一、使用指定的或者默认的编码集将字节解码为字符
二、调用StreamDecoder自身实现的读取方法将解码后的字符读取到程序中。
在理解这两个流的时候要注意:java-io中只有将字节转换成字符的类,没有将字符转换成字节的类,缘由很简单——字符流的存在原本就像对字节流进行了装饰、加工处理以便更方便的去使用。在使用这两个流的时候要注意:因为这两个流要频繁的对读取或者写入的字节或者字符进行转码、解码和与底层流的源和目的地进行交互、因此使用的时候要使用BufferedWriter、BufferedReader进行包装、以达到最高效率、和保护存储介质。