Java 输入输出相关概念介绍与总结(File、IO 流)(十四)(InputStreamReader)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

上一篇文章我们介绍的是CharArrayReader,讲解了它基本概念及一些常用的方法。因为比较容易理解,所以就没有进行具体举例。这篇文章我们会继续介绍Reader 的另一个实现类:InputStreamReader。

概念理解

对于InputStreamReader 的理解,我们先看一张之前发过的图:

image.png

从图中可以看出,InputStreamReader 也是继承于Reader 类,同时InputStreamReader 和FileReader / File 也有一定的关系。

InputStreamReader 本身的作用就是将字节流转换为字符流。

InputStreamReader 作为字节流通向字符流的桥梁,它课程将字节流转换为字符流输出,并且它可以为字节流指定字符集。

指定字符集之后,可以操作输出一个个字符;如果不指定字符集的编码,那么在解码过程将使用平台默认的字符编码。

InputStreamReader 使用指定的字符集读取字节,同时将其解码为字符。

它使用的字符集可以指定(由名称指定或显式给定),如果不指定,那么会使用平台默认的字符集。

转换流在生效的过程中,需要和其他输入流配合,将其他输入流中的数据转以字符为单位的数据。

在每次调用InputStreamReader 的read() 方法后,都会导致从作为构造参数的输入流中读取一个或多个字节。

如果开发中需要有效的从字节到字符的转换,我们可以提前从传入的流中读取更多的字节,超过满足当前读取操作所需的字节,这样就可以避免一些可能由于字符字节占位不一致导致的问题。

构造函数

// 使用默认字符集创建一个InputStreamReader。
InputStreamReader(InputStream in)
// 使用给定字符集创建一个InputStreamReader 实例。
InputStreamReader(InputStream in, Charset cs)
// 使用给定字符集解码器创建InputStreamReader 实例。
InputStreamReader(InputStream in, CharsetDecoder dec)
// 同上,只不过字符集参数不一致。
InputStreamReader(InputStream in, String charsetName)
复制代码

常用方法

// 关闭流并释放资源。
void close()   
// 返回字符编码名称
String getEncoding()
// 读取单个字符
int read()
// 根据参数,将字符读入,并置入数组中的某一部分
int read(char[] cbuf, int offset, int length)
复制代码

使用举例

public static void transReadNoBuf() throws IOException {
  // 读取文件的数据
  InputStream inputStream = new FileInputStream("copy.txt");  
  InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//读取  

  char[] charArray = new char[10];
  int len = inputStreamReader.read(charArray);
  System.out.println(new String(charArray,0,len));
  inputStreamReader.close();
}
复制代码

看例子也比较清晰明了,本身是FileINputStream,然后通过InputStreamReader 将其转换为字符流进行输出。

总结

本篇文章讲的是InputStreamReader 的概念及使用方法,也是Reader 实现类中最后一个常用类的介绍。之后的文章将介绍字符输出流Writer 的相关内容。

猜你喜欢

转载自juejin.im/post/7086448237657194510