桥接流InputStreamReader、OutputStreamWriter以及适配器模式

详细介绍了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学习博客!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值