- java.lang.Object
-
- java.io.Reader
-
- java.io.InputStreamReader
-
- java.io.FileReader
读取文件内容,而且是按照字符读取,一个字母算一个字符,一个汉字也算一个字符,但是回车是一个字符,换行是一个字符,\r\n(回车换行)是会被读成两个字符的。
这个类很直接,实例化定义的时候直接将文件路径为构造参数就可以,或者是从其他类里拿到的File对象也行。
FileReader有两个读取数据的方法,一个是read() 另一个是read(char[] cbuf, int offset, int length)参数offset和length可以省略。
read()就是从文件中一个字符一个字符的读取,代码如下:
FileReader reader = new FileReader(file);
int cint;
while((cint=reader.read()) != -1){
System.out.print((char)cint);
}
read(char[] cbuf, int offset, int length)就是从文件中一下读取多个字符把数组装满,代码如下:
FileReader reader = new FileReader(file);
char[] c = new char[1024];
int len;
while((len=reader.read(c)) != -1){
if (len!=1024){
c = Arrays.copyOf(c, len);
}
System.out.print(c);
}
这样可以一次读取缓冲多个字符减少IO读次数,毕竟IO操作是最耗时的,能用内存空间换取读取速度还是值得的。
代码中有个 Arrays.copyOf(c, len); 操作,是因为最后一次读取的时候可能剩下的文件内容不够1024个字符了,这个时候就要按照读取到的字符数量从数组中截取内容,否则数组中后续其他内容是上次读取的字符数据,没必要再重复处理了。
这是按照字符处理,如果读取的文件不是文本文件,例如图片、视频、zip等等,那就要按照字节读取,FileReader: 臣妾做不到啊!“FileReader
is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream
.” 官方告诉我们要去找他兄弟 FileInputStream。