在Java中经常会遇到要读取某个文件的内容的问题,读取的方式有很多种,可以使用FileInputStream读取然后输出,但是这种方式只能一次性读取一大段字节而不是按照行数读取,这里我们就要用到一个类:BufferedReader,在API中的描述如下:
BufferedReader(Reader in)
Creates a buffering character-input stream that uses a default-sized input buffer.
可见其构造方法的参数是一个Reader类,而Reader类是一个抽象类,是不能直接创建对象的,所以这里需要创建Reader类的子类InputStreamReader,而InputStreamReader类的构造方法在API中的描述是:
InputStreamReader(InputStream in)
Creates an InputStreamReader that uses the default charset.
它的参数是InputStream类,很不巧,这个类也是一个抽象类,也不能直接创建对象,所以还要借助于这个InputStream类的子类FileInputStream,而这里的FileInputStream才真正的和文件File类有关联了,所以这里需要创建多个对象,下面我们代码来说明这个过程:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestReadLine {
public static void main(String[] args) {
// 在E盘下新建一个文本文件
File file1 = new File("E:\\test.txt"); // 创建File类对象
FileInputStream fis = null; // 创建FileInputStream类对象读取File
InputStreamReader isr = null; // 创建InputStreamReader对象接收文件流
BufferedReader br = null; // 创建reader缓冲区将文件流装进去
try {
fis = new FileInputStream(file1);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
String lineTxt = null;
// 从缓冲区中逐行读取代码,调用readLine()方法
while ((lineTxt = br.readLine()) != null) {
System.out.println(lineTxt); // 逐行输出文件内容
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 文件执行完毕别忘了关闭数据流
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}