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

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

上一篇文章Java 输入输出相关概念介绍与总结(File、IO 流)(十) 大概介绍了一下字符输入流Reader 的相关概念,这篇文章我们会对Reader 的子类:FileReader 做具体讲解,包括概念和使用方法。

FileReader

FileReader 的概念

FileReader 是最常用的一个Reader 实现类,和FileInputStream 很相似,只是除了一点:FileReader 是以字符为单位进行读取;FileInputStream 是以字节为单位进行读取。

所以类比之前讲过的FileInputStream,我们可以推断出,FileReader 是用于读取文本内容的。而根据不同的编码方案,一个字符可能会相当于一个或者多个字节。比如说一个汉字字符在不同的编码中,可能会用两个字节或者三个字节表示。

FileReader 的基本原理

  • 在使用FileReader 对象操作读取并输入文件的时候,JVM 首先读取文本,然后将其格式转化为Unicode 编码格式,然后进行操作;在使用FileWriter 进行文本文件输出时,会把以Unicode 编码的数据转换成本地主机的编码格式(如ASCII 或者GBK 这种),然后再进行输出。

  • 对于FileReader 和FileWriter,其实两个类和FileInputStream 及FileOutputStream 这两个类的操作方法基本相同,像前面说的那样,前者基于字符,以字符为单位;后者基于字节,以字节为基本操作单位。

如果操作的文件不是文本文件(文本文件比如说txt 这种,非文本文件比如说音乐、图片这种),这个时候我们最好使用FileInputStream 与FileOutputStream 进行文件的输入输出。因为以字符为单位传来传去,一个不小心就会乱码,或者损坏文件。

FileReader 的方法介绍

构造方法

// 已存在File 对象,根据此File 对象创建一个FileReader
FileReader(File file)

// 已存在FileDescriptor 的情况下创建一个FileReader
FileReader(FileDescriptor fd)

// 给定文件名,根据这个文件名创建FileReader
FileReader(String fileName)
复制代码

常用方法

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

// 这个就和“字符”的概念有关了,作用是返回这个这个流使用的字符编码的名称
String getEncoding()   

// 读取单个字符(注意:返回的值为读入字符对应的int值,范围:0~65535)
int read()

// 按照参数,将字符读入数组中,存在于数组的某一部分。返回值是读入字符的个数
int read(char[] cbuf, int offset, int length)

// 用来判断这个流是否已经准备好,是否可以用于读取。返回值为读入字符的个数
boolean ready()
复制代码

使用示例

用FileWriter类向文件中写入一个串字符,然后用FileReader读出写入的内容。

public static void main(String[] args) throws Exception {
  FileWriter fileWriter = new FileWriter("copy.txt");
  // 我们可以回忆一下,在使用FileOutputStream 的时候,可以用个字节数组作为"中间层"
  // 而使用FileWriter 的时候可以在此可以直接写入字符串,不用转化为字节数组
  fileWriter.write ("12345");
  fileWriter.close();

  char[] chars = new char[16];
  // 读取copy.txt 文件
  FileReader in = new FileReader("copy.txt");
  int len = in.read(chars);
  System.out.println(new String(chars,0,16));
  in.close();
}
复制代码

总结

这边文章我们介绍了FileReader 的使用。我们也的确可以看出,使用上和FileInputStream 差不多,区别就是FileReader 是以字符为单位,而FileInputStream 是以字节为单位的。

下一篇文章我们继续介绍Reader 类的其他子类。

猜你喜欢

转载自juejin.im/post/7085026614525820958