举一个简单的例子,进行逐行分析
FileInputStream fileInputStream = new FileInputStream("src/main/resources/test.txt");
// 将字节流转换为字符流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
// 使用 BufferedReader 来读取字符流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
- FileInputStream是一个父类装饰器,它继承了InputStream抽象类,因此FileInputStream实例具备了InputStream抽象类中实现好了的字节流的read方法。
- InputStreamReader的构造方法是
public InputStreamReader(InputStream in, String charsetName)
throws UnsupportedEncodingException
{
super(in);
if (charsetName == null)
throw new NullPointerException("charsetName");
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
因此InputStreamReader继承自Reader抽象类,因此super(in)会传入fileInputStream实例给Reader构造器,
protected Reader(Object lock) {
if (lock == null) {
throw new NullPointerException();
}
this.lock = lock;
}
Reader构造器会引用fileInputStream对象作为lock对象,作为read方法的对象锁。最终fileInputStream实例被InputStreamReader装饰了,成为了inputStreamReader 实例。
BufferedReader装饰器,它继承了Reader抽象类,它的构造函数是this
public BufferedReader(Reader in) {
this(in, defaultCharBufferSize);
}
因此,BufferedReader类内自定义了一些增强方法比如fill。inputStreamReader实例具备了InputStream,Reader装饰过的方法,比如fill方法通过自定义内部调用来实现增强,那么返回的bufferedReader便是被BufferedReader装饰过后的实例。
调用bufferedReader方法:
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
可以看出调用的readLine方法就是继承了Reader抽象类,然后被BufferedReader 装饰类增强而来。