博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaIO<14>InputStreamReader和OutputStreamWriter源码分析
阅读量:6378 次
发布时间:2019-06-23

本文共 6800 字,大约阅读时间需要 22 分钟。

hot3.png

InputStreamReader和OutputStreamWriter 是字节流通向字符流的桥梁:它使用指定的 charset 读写字节并将其解码为字符。
InputStreamReader 的作用是将“字节输入流”转换成“字符输入流”。它继承于Reader。

OutputStreamWriter 的作用是将“字节输出流”转换成“字符输出流”。它继承于Writer。

InputStreamReader和OutputStreamWriter源码分析

1. InputStreamReader 源码(基于jdk1.7.40)

package java.io;   import java.nio.charset.Charset;  import java.nio.charset.CharsetDecoder;  import sun.nio.cs.StreamDecoder;    // 将“字节输入流”转换成“字符输入流”  public class InputStreamReader extends Reader {       private final StreamDecoder sd;       // 根据in创建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);          }      }       // 根据in创建InputStreamReader,使用编码charsetName(编码名)      public InputStreamReader(InputStream in, String charsetName)          throws UnsupportedEncodingException      {          super(in);          if (charsetName == null)              throw new NullPointerException("charsetName");          sd = StreamDecoder.forInputStreamReader(in, this, charsetName);      }       // 根据in创建InputStreamReader,使用编码cs      public InputStreamReader(InputStream in, Charset cs) {          super(in);          if (cs == null)              throw new NullPointerException("charset");          sd = StreamDecoder.forInputStreamReader(in, this, cs);      }       // 根据in创建InputStreamReader,使用解码器dec      public InputStreamReader(InputStream in, CharsetDecoder dec) {          super(in);          if (dec == null)              throw new NullPointerException("charset decoder");          sd = StreamDecoder.forInputStreamReader(in, this, dec);      }       // 获取解码器      public String getEncoding() {          return sd.getEncoding();      }       // 读取并返回一个字符      public int read() throws IOException {          return sd.read();      }       // 将InputStreamReader中的数据写入cbuf中,从cbuf的offset位置开始写入,写入长度是length      public int read(char cbuf[], int offset, int length) throws IOException {          return sd.read(cbuf, offset, length);      }       // 能否从InputStreamReader中读取数据      public boolean ready() throws IOException {          return sd.ready();      }       // 关闭InputStreamReader      public void close() throws IOException {          sd.close();      }  }

2. OutputStreamWriter 源码(基于jdk1.7.40)

package java.io;   import java.nio.charset.Charset;  import java.nio.charset.CharsetEncoder;  import sun.nio.cs.StreamEncoder;   // 将“字节输出流”转换成“字符输出流”  public class OutputStreamWriter extends Writer {       private final StreamEncoder se;       // 根据out创建OutputStreamWriter,使用编码charsetName(编码名)      public OutputStreamWriter(OutputStream out, String charsetName)          throws UnsupportedEncodingException      {          super(out);          if (charsetName == null)              throw new NullPointerException("charsetName");          se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);      }       // 根据out创建OutputStreamWriter,使用默认的编码      public OutputStreamWriter(OutputStream out) {          super(out);          try {              se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);          } catch (UnsupportedEncodingException e) {              throw new Error(e);          }      }       // 根据out创建OutputStreamWriter,使用编码cs      public OutputStreamWriter(OutputStream out, Charset cs) {          super(out);          if (cs == null)              throw new NullPointerException("charset");          se = StreamEncoder.forOutputStreamWriter(out, this, cs);      }       // 根据out创建OutputStreamWriter,使用编码器enc      public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {          super(out);          if (enc == null)              throw new NullPointerException("charset encoder");          se = StreamEncoder.forOutputStreamWriter(out, this, enc);      }java io系列01之 "目录"      // 获取编码器enc      public String getEncoding() {          return se.getEncoding();      }       // 刷新缓冲区      void flushBuffer() throws IOException {          se.flushBuffer();      }       // 将单个字符写入到OutputStreamWriter中      public void write(int c) throws IOException {          se.write(c);      }       // 将字符数组cbuf从off开始的数据写入到OutputStreamWriter中,写入长度是len      public void write(char cbuf[], int off, int len) throws IOException {          se.write(cbuf, off, len);      }       // 将字符串str从off开始的数据写入到OutputStreamWriter中,写入长度是len      public void write(String str, int off, int len) throws IOException {          se.write(str, off, len);      }java io系列01之 "目录"      // 刷新“输出流”      // 它与flushBuffer()的区别是:flushBuffer()只会刷新缓冲,而flush()是刷新流,flush()包括了flushBuffer。      public void flush() throws IOException {          se.flush();      }       // 关闭“输出流”      public void close() throws IOException {          se.close();      }  }

说明

OutputStreamWriter 作用和原理都比较简单。

作用就是将“字节输出流”转换成“字符输出流”。它的原理是,我们创建“字符输出流”对象时,会指定“字节输出流”以及“字符编码”

示例程序

package org.credo.jdk.io;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;public class StreamConverterTest{	private static final String FileName = "file.txt";      private static final String CharsetName = "utf-8";  	public static void main(String[] args) throws IOException	{		testWrite();		testRead();	}		private static void testWrite() throws IOException {		File file=new File(FileName);		OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(file), CharsetName);		outputStreamWriter.write("中国人民站起来啦!");		outputStreamWriter.write("gogogo!\n");		outputStreamWriter.close();	}		  private static void testRead() throws IOException {		  File file = new File(FileName);		  InputStreamReader inputStreamReader=new InputStreamReader(new FileInputStream(file), CharsetName);		  char temp=(char) inputStreamReader.read();		  System.out.println(temp+""+inputStreamReader.read());		  inputStreamReader.skip(5);		  if(!inputStreamReader.markSupported()){			  System.out.println("不支持mark");		  }		  char[] buf = new char[2];		  inputStreamReader.read(buf, 0, buf.length);            System.out.println("buf="+(new String(buf)));		  System.out.println("temp3:"+(char)inputStreamReader.read());//          inputStreamReader.reset();//          char temp2=(char) inputStreamReader.read();//		  System.out.println(temp2);	  }}
中22269
不支持mark
buf=啦!

temp3:g

结果说明

(01) testWrite() 的作用是将“内容写入到输出流”。写入的时候,会将写入的内容转换utf-8编码并写入。
(02) testRead() 的作用是将“内容读取到输入流”。读取的时候,会将内容转换成utf-8的内容转换成字节并读出来。

转载于:https://my.oschina.net/zhaoqian/blog/350489

你可能感兴趣的文章
在linux下执行依赖多个jar的类的方法
查看>>
****** 二十五 ******、软设笔记【数据库】-数据库语言-数据定义、数据查询
查看>>
day7面向对象--反射
查看>>
文件打开方式
查看>>
NET多线程探索-NET线程基础知识点
查看>>
Oracle 11g R2 新特性
查看>>
微信小程序新手知识
查看>>
java中数据流的简单介绍
查看>>
根据物流号查看物流信息
查看>>
jsp设置MIME类型
查看>>
python模拟自动登录网站(urllib2)
查看>>
Java 对文件的操作
查看>>
洛谷 题解 P3627 【[APIO2009]抢掠计划】
查看>>
springboot传入json和文件_SpringBoot系列教程22-整合SpringMVC之HttpMessageConverters
查看>>
不礼让行人怎么抓拍的_张家川公安交警持续曝光机动车不礼让行人【第24期】...
查看>>
用pythonturtle写名字_去年爆款新生儿名字,家长自以为起的不错,却有“棺材”的意思...
查看>>
句子分类_语法微课句子的分类+文本讲解
查看>>
图形化分析工具_推荐一款基于小米 soar 的开源 sql 分析与优化的 web 图形化工具...
查看>>
485 工控机 接线方式_RS485温湿度传感器的接线方式及注意事项
查看>>
u3d游戏开发视频潭州_unity3d教程视频-unity3d教程中文零基础入门/u3d游戏开发/特效案例/项目实战V2.0 最新版 - 极光站...
查看>>