【Java部分源码分析之io篇】6.InputStreamReader
2017-07-31 00:00
585 查看
InputStreamReader是Reader的一个子类。它的源码比较简单,因为它主要实现都调用了一个流解码类StreamDecoder,它只有这一个成员变量,而这一个类把它的所有操作都包括了。StreamDecoder它有什么用呢?它的主要作用是获取一个字节输入流InputStream,然后根据给定的编码方案读取字符,如果没有给定,则默认是系统编码。
看一下这个成员变量的声明。
就这么简单的声明。StreamDecoder 也是Reader的子类。如果想了解这个类可以看一下这里http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/cs/StreamDecoder.java。
接下来看一下InputStreamReader的四个构造方法。
利用这个类对重要的两个参数是InputStream和charset,眼尖的小伙伴也许看到了StreamDecoder.forInputStreamReader(in, this, dec)中的this,我们知道this代表的是这个类的实例对象,那传这个对象进去干嘛呢?这个对象会最终传到Reader里面的lock对象,所以说这个对象是为了加锁用的。
接下来把剩下所有的代码都贴出来吧。
可以看到这个InputStreamReader是非常的简单。
看一下这个成员变量的声明。
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是非常的简单。
相关文章推荐
- 【Java部分源码分析之io篇】7.FileReader
- Java IO:PipedReader和PipedWriter使用详解及源码分析
- 【Java8源码分析】IO包-Reader、BufferedReader和Scanner总结
- 【Java部分源码分析之io篇】5.Reader
- 【Java部分源码分析之io篇】0.传统IO输入输出流总览
- Java IO:CharArrayReader使用及源码分析
- 《Java 源码分析》:Java NIO 之 Selector(第二部分selector.select())
- javaIO(1):OutputStream和FileOutputStream源码分析及“装饰者模式”在IO中的应用
- Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理
- Java IO 系列源码分析——ByteArrayInputStream和ByteArrayOutputStream
- Java IO:BufferedInputStream使用详解及源码分析
- Java IO:CharArrayWriter使用及源码分析
- Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
- Java BufferedWriter BufferedReader 源码分析
- Java IO:PipedOutputStream和PipedInputStream使用详解及源码分析
- Java IO:ByteArrayOutputStream使用详解及源码分析
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
- java.io.ByteArrayOutputStream 源码分析
- Java IO完全总结(转载) --- 重点在源码分析
- Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理