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

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

因为据说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进行包装、以达到最高效率、和保护存储介质。

Java IO--字符流--InputStreamReader 和 OutputStreamWriter的更多相关文章

  1. Java Io 字符流

    Java Io 字符流包含: 1. InputStreamReader  它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite  它是char流到byt ...

  2. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  3. Java IO: 字符流的Piped和CharArray

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...

  4. java IO字符流

    字节流:因为内存中数据都是字节,二进制数据. 字符流:方便处理文本数据.字符流是基于字节流的. ascii 编码表,并且各国都有自己的编码表. unicode码表,世界码表.优化后 utf-8码表. ...

  5. java -io字符流FileWrite操作演示

    FileWriter字符输出流演示: /* * FiileWriter 字符流的操作 * FileWriter 的构造方法 可传递 File类型 还可以传递String类型 * * 方法 : * wr ...

  6. Java IO 转换流 字节转字符流

    Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...

  7. java IO选择流的原则及其与IO流相关类的关系

    1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...

  8. Java IO 嵌套流、文本的输入输出和存储

    Java IO 嵌套流.文本的输入输出和存储 @author ixenos 1.   组合流过滤器(嵌套流) a)    跨平台文件分割符:常量字符串 java.io.File.seperator 等 ...

  9. Java IO 节点流 ByteArrayInput/OutputStream

    Java IO 节点流 ByteArrayInput/OutputStream @author ixenos ByteArrayInputStream 包含一个内部缓冲区(字节数组byte[]),该缓 ...

随机推荐

  1. java并发包分析之———AQS框架

    一.什么是同步器   多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx . 这个共同的语义可以称之为同步器.可以认为以上所有的锁机制都可以基 ...

  2. Django的时区问题

    在Django项目中,最好全部日期值都做成配时区信息的,但是由于遗留项目或者跨语言项目,其他语言的开发人员觉得时区信息处理太麻烦.如何在一个项目中同时适配带时区和不带时区的两种字段. 1.输出:不带时 ...

  3. Linux/Windows 文件交互读取转义字符变换

  4. CSS的display:table

    好久都没有写博客了,似乎总是觉得少了些什么-- 刚好最近在工作中遇到了一个新的东西display:table,这个也是css的布局的一种,而且又是display的,之前已经写过了display的fle ...

  5. ES6(阮一峰)学习总结

    1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域. { var a = 5; let b = 6; } console.log(a); co ...

  6. Lintcode400 Maximum Gap solution 题解

    [题目描述] Given an unsorted array, find the maximum difference between the successive elements in its s ...

  7. CSS学习笔记3:选择器及优先级

    CSS选择器的类型: 标签选择器 类选择器 ID选择器 全局选择器 群组选择器 后代选择器   1.标签选择器:     以HTML的标签作为选择器,凡是选择了一个标签,那么所有这个标签的内容都是用了 ...

  8. Python_Excel文件操作

    ''' 使用xlrd模块写入Excel文件 ''' import xlrd book=xlrd.open_workbook(r'/Users/c2apple/Desktop/纪录/测试报告/张涛文件盘 ...

  9. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xef in position 99: invalid continuation byte

    Traceback (most recent call last): File "/Users/c2apple/PycharmProjects/easyToPython/fileMethod ...

  10. 指针超强汇总(谨记优先级:() > [] > *)

    参考:http://blog.chinaunix.net/uid-20120277-id-5760985.html C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则 ...