1. 读取方式一
Reader中读取的方法有读取单个字符的方法(read() ),有读取字符数组的方法(read(char[] cbuf) ),还有读取部分数组的方法(read(char[] cbuf, int off, int len) )。
1.要读取文件,需要创建读取对象。FileReader是用来读取字符文件的便捷类。那么,我们可以用它来创建读取字符数据的流对象。在创建读取流对象时,必须要明确被读取的文件。所以一定要确定该文件是存在的。用一个读取流关联一个文件,可能会抛出异常FileNotFoundException,处理一下。
2.使用流读取文件,最后一定要关闭文件,使用在finally中关闭文件。
3.使用read()方法读取字符,该方法可能会抛出异常IOException,捕获一下。返回的的是读取到的字符对应的整数。当读到流的末尾,则返回 -1。read()方法每次读取一个字符,就要通过循环,使用readd()方法读取文件内容,当read()方法的返回值时-1的时候,读取停止,即循环停止。
完整代码:
package com.java.base;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args){
FileReader fr = null;
try{
fr = new FileReader("demo.txt");
int ch = 0;
while((ch = fr.read()) != -1){
System.out.println((char)ch);
}
}catch(FileNotFoundException e1){
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}finally{
if(fr != null){
try{
fr.close();
}catch(IOException e3){
e3.printStackTrace();
}
}
}
}
}
这就是一次读一个字符的方法。
2. 读取方式二
一次读一个字符和一次读一个数组,它们的返回值都是int,但是一次读一个字符返回的是作为整数读取的字符,而一次读一个数组的方法返回的是读取到的字符数。
使用read(char[])读取文本文件数据。使用这个方法,会将字符读入数组,所以,要先创建字符数组。数组的长度可以随便写。为了方便观察,把demo.txt文件中的内容改成a
bcd
,读取到的数组的长度设置为
3
,写代码读取文件,观察一下运行的结果。
package com.java.base;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args){
FileReader fr = null;
try{
fr = new FileReader("demo.txt");
char[] chs = new char[3];
int num = fr.read(chs);
System.out.println("num="+num+":"+new String(chs));
num = fr.read(chs);
System.out.println("num="+num+":"+new String(chs));
num = fr.read(chs);
System.out.println("num="+num+":"+new String(chs));
}catch(FileNotFoundException e1){
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}finally{
if(fr != null){
try{
fr.close();
}catch(IOException e3){
e3.printStackTrace();
}
}
}
}
}
这时候,运行的结果是:
num=3:abc
num=1:dbc
num=-1:dbc
第一次读取的时候,依次读取到三个字符,
abc
,分别把
abc
存入到数组中,这时候返回的结果是
3
;第二次读取的时候,读到
d
的时候,把
d
放入数组中,这时候数组中存着的是上次读取到的数据,所以,这时候,
b
把
a
覆盖掉,往后没有读取到数据,所以数组中存的是
bcd
,返回值是
1
,的三次,没有读取到数据,所以返回
-1
,因为没有读取到任何数据,所以数组中的内容不变,也是
bcd
。
这时候,可以修改代码,读到几个字符,就把几个字符变成字符串,把能读取到数据的数组变成字符串的代码改成,
new String(chs,0,num)
,第二次读取到的数组变成字符串就是
d
,没有多余的字符了。
在实际读取的时候,是不会这么写代码去读取文件的,修改一下,把它变成循环操作。
package com.java.base;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args){
FileReader fr = null;
try{
fr = new FileReader("demo.txt");
char[] chs = new char[3];
int len = 0;
while((len = fr.read(chs)) != -1){
System.out.println(new String(chs, 0, len));
}
}catch(FileNotFoundException e1){
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}finally{
if(fr != null){
try{
fr.close();
}catch(IOException e3){
e3.printStackTrace();
}
}
}
}
}
那么,每次读取一个字符和读取一个字符数组,那种方式比较好?使用第一种方法,每次读取一个字符,需要循环
5
次,使用第二种方法,可以通过修改存入数组的长度改变循环次数,数组长度为
3
的时候,循环两次,长度为
10
的时候,只需要循环依次,所以使用第二种方式,效率高。
这个字符数组的长度组好是
1024
的整数倍,因为
1
个千字节等于
1024
字节(
1kb=1024byte=1024*8bi
)。