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

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

之前文章我们主要围绕File 类,及字节流的两个抽象类InputStream / OutputStream 和它们的子类的概念及使用方法做了基本的讲解。上一篇文章Java 输入输出相关概念介绍与总结(File、IO 流)(九)是关于InputStream 和OutputStream 的最后一篇文章,从现在开始,我们将开始介绍字符流相关的内容。

在Java IO 中,字符流有两个相关的抽象类Reader / Writer。我们先从字符输入流Reader 开始讲起。

Reader 基本概念

Reader 类本身是一个抽象类,也是用来处理输入流的。它和InputStream 的区别是:它是以字符为单位的输入流(简称字符输入流)的公共父类。

Reader 类的继承关系

Reader 对应的各个子类如图所示:

Screen Shot 2022-04-09 at 2.14.32 PM.png

其中几个常用的实现类为:

  • BufferedReader:这个和BufferedInputStream 的概念很相似了,就是从流里面读取出文本之后,然后写入缓存,可以提高效率。对于缓存的大小,用户可以人为指定,代码中也设置了默认大小。我们在日常使用过程中,可以直接使用默认大小就可以了。可以读取字符、数组和行。

  • InputStreamReader:前面介绍中有提过中这个,作用就是把字节转成字符的,对于常遇到的乱码问题可以很好地解决。

  • FileReader:为读取字符文件提供。

Reader 类的一些函数

Reader 抽象类中的构造函数如下:

protected Reader() //创建一个新的字符流 reader,其重要部分将同步其自身的 reader。

// 其英文注释为:
// Creates a new character-stream reader whose critical sections will
// synchronize on the given object.
// 意思就是:创建一个新的字符流reader,其重要部分将同步给定的对象。
// 因为这是个抽象类,所以具体的解释我们放到后续的子类介绍中进行讲解。
// 对于这两种构造方法,不带参数时,将自己作为锁;如果传入了某个Object 对象,则将这个对象其作为锁。
protected Reader(Object lock)
复制代码

方法:

// 关闭流,释放资源
abstract  void  close()

// 标记流中的此时当前的位置
void  mark(int readAheadLimit)

// 是否支持标记操作(上面的mark 函数的作用)
boolean  markSupported()

// 读取一个字符
int  read()

// 将字符读入cbuf 数组
int  read(char[] cbuf)

// 将字符读入数字,存入参数中的位置
abstract  int  read(char[] cbuf, int off, int len)

// 将字符读入此字符缓冲区
int  read(CharBuffer target)

// 判断是否准备好读取这个流
boolean  ready()

// 重置流
void  reset()

// 跳过字符
long  skip(long n)
复制代码

总结

上面只是讲述了Reader 的相关结构,但是因为Reader 本身是个抽象类,所以具体的使用在之后介绍到各个继承的子类的时候再讲。

后续文章会对Reader 的子类做详细的介绍。

猜你喜欢

转载自juejin.im/post/7084992608061095967