一起养成写作习惯!这是我参与「掘金日新计划 · 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 类的其他子类。