文档章节

【Java部分源码分析之io篇】6.InputStreamReader

gongwilliam
 gongwilliam
发布于 2017/07/31 15:46
字数 455
阅读 59
收藏 0

InputStreamReader是Reader的一个子类。它的源码比较简单,因为它主要实现都调用了一个流解码类StreamDecoder,它只有这一个成员变量,而这一个类把它的所有操作都包括了。StreamDecoder它有什么用呢?它的主要作用是获取一个字节输入流InputStream,然后根据给定的编码方案读取字符,如果没有给定,则默认是系统编码。

看一下这个成员变量的声明。

    private final StreamDecoder sd;

就这么简单的声明。StreamDecoder 也是Reader的子类。如果想了解这个类可以看一下这里http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/cs/StreamDecoder.java。

接下来看一下InputStreamReader的四个构造方法。

    public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
        } catch (UnsupportedEncodingException e) {
            // The default encoding should always be available
            throw new Error(e);
        }
    }
    public InputStreamReader(InputStream in, String charsetName)
        throws UnsupportedEncodingException
    {
        super(in);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
    }
    public InputStreamReader(InputStream in, Charset cs) {
        super(in);
        if (cs == null)
            throw new NullPointerException("charset");
        sd = StreamDecoder.forInputStreamReader(in, this, cs);
    }
    public InputStreamReader(InputStream in, CharsetDecoder dec) {
        super(in);
        if (dec == null)
            throw new NullPointerException("charset decoder");
        sd = StreamDecoder.forInputStreamReader(in, this, dec);
    }

利用这个类对重要的两个参数是InputStream和charset,眼尖的小伙伴也许看到了StreamDecoder.forInputStreamReader(in, this, dec)中的this,我们知道this代表的是这个类的实例对象,那传这个对象进去干嘛呢?这个对象会最终传到Reader里面的lock对象,所以说这个对象是为了加锁用的。

接下来把剩下所有的代码都贴出来吧。

    public String getEncoding() {
        return sd.getEncoding();
    }
    public int read() throws IOException {
        return sd.read();
    }
    public int read(char cbuf[], int offset, int length) throws IOException {
        return sd.read(cbuf, offset, length);
    }
    public boolean ready() throws IOException {
        return sd.ready();
    }
    public void close() throws IOException {
        sd.close();
    }

可以看到这个InputStreamReader是非常的简单。

© 著作权归作者所有

gongwilliam
粉丝 2
博文 14
码字总数 12127
作品 0
深圳
私信 提问
加载中

评论(0)

泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
2019/04/02
0
0
从1+1=2来理解Java字节码

背景 前不久《深入理解Java虚拟机》第三版发布了,赶紧买来看了看新版的内容,这本书更新了很多新版本虚拟机的内容,还对以前的部分内容进行了重构,还是值得去看的。本着复习和巩固的态度,...

木木匠
2019/12/30
5.9K
11
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
2019/03/05
865
0
Java NIO原理 图文分析及代码实现

Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术...

囚兔
2015/04/29
341
1

没有更多内容

加载失败,请刷新页面

加载更多

乳山哪里可以开医院门诊发票-中国新闻网

乳山哪里可以开医院门诊发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

18281711164
今天
54
0
庄河哪里可以开医院门诊发票-中国新闻网

庄河哪里可以开医院门诊发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

18249433684
今天
55
0
IntelliJ 如何找到项目中 Deprecated 的方法

在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection。 选择 Analyze > Inspect Code 在弹出的对话框中,对整个...

honeymoose
今天
85
0
Java中的排序算法:冒泡排序

学习了一种新的排序算法:冒泡排序,冒泡排序是一种交换排序,指比较相邻的两个元素,如果前者比后者大,就交换位置,继续进行比较。 通过例子来实现: import java.util.Arrays; public cl...

北芷南姜
今天
73
0
OSChina 周五乱弹 —— 你不仅要背负工作,还要背负领导

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Cold Rain》- AniFace 手机党少年们想听歌,请使劲儿戳(这里) @明月依稀 :露...

小小编辑
今天
318
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部