详细介绍了Java IO中的桥接流InputStreamReader、OutputStreamWriter以及适配器模式。
文章目录
1 InputStreamReader桥接输入流
public class InputStreamReader
extends Reader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并在内部将其解码为字符。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了提高转换效率通常与BufferedReader结合使用。
1.1 构造器
public InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader,即将字节输入流转字符输入流。
传递一个InputStream,当然可以传递System.in了
public InputStreamReader(InputStream in,String charsetName)
throws UnsupportedEncodingException
创建一个InputStreamReader,使用指定的字符集进行转换。
1.2 API方法
大部分方法都继承或重写自父类Reader的方法
特有的方法:
public String getEncoding()
返回此流使用的字符编码的名称,如果流已经关闭,则返回 null
2 OutputStreamWriter桥接输出流
public class OutputStreamWriter
extends Writer
OutputStreamWriter是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中。
2.1 构造器
new OutputStreamWriter(OutputStream out);
创建使用默认字符编码的 OutputStreamWriter。默认utf-8
new OutputStreamWriter(OutputStream out, String charsetName);
创建使用指定字符集的 OutputStreamWriter。
2.2 API方法
大部分方法都继承或重写自父类Writer的方法
特有的方法:
public String getEncoding()
返回此流使用的字符编码的名称。
其余方法均继承或重写自父类Writer的方法。
3 字节流如何转为字符流
字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入InputStream对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入OutputStream对象。
4 适配器模式
适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。即将一个类的接口转换成客户希望的另一个接口,适配器模式让那些超级接口不兼容的类可以一起工作,让被适配的类可以使用目标类的方法!
适配器模式有类适配器模式,对象适配器模式,接口适配器模式。
IO流中多处使用了适配器模式,比较典型的就是字节流转字符流,目标接口字符流Reader与需要被适配的类InputStream原本是两个不相干的类,为了满足可以读字符功能,有了适配器者InputStreamReader(委托给内部的StreamDecoder)。InputStreamReader的作用就是将字节输入流转换为能读取字符的字符输入流。
同理OutputStreamWriter(委托给内部的StreamEncoder)也用到了适配器模式,将字符流转换为字节流,写字符的功能转换为写字节的功能。以上都是基于对象的适配器,他将字符流转换为字节流。
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!