- /*
- 需求:
- 利用装饰设计模式,模仿jvm底层实现BufferedReader或者BufferedWriter的方式,自定义读写缓冲区.
- 思路:
- 缓冲区其实就是对默认的字符输入输出流(FileReader和FileWriter)字节输入输出流进行功能修饰.
- 用到了装饰设计模式.
- 步骤:
- 1.自定义方法,参数列表为需要的输入或者输出流.
- 2.将作为参数传递的输入输出流Read或者Writer方法进行缓冲区功能性加强.
- 3.封装自定义方法类.作为自定义缓冲区类.
- */
- import java.io.*;
- class MyBufferedReader{
- //为了让整个类都能调用fr的方法进行装饰.
- private FileReader fr;
- MyBufferedReader(FileReader fr){//让该类一旦实例化,必然存在一个FileReader对象.
- this.fr = fr;
- }
-
- //定义读取一行的方法.
- public String readLine()throws IOException{
- int ch = 0;
- StringBuilder line=new StringBuilder();
- while((ch=fr.read())!=-1){
- if (ch=='\r'){
- if ((ch=fr.read())=='\n'){//同时遇到
- return line.toString();
- }else{
- // line.append('\r'); //如果单单遇到\r而不是\r\n,就把\r放进读取的字符串中.
- }
- }
- line.append((char)ch);
- }
- if (line.length()!=0)//当读到结尾,line中还存在数据的话,就返回这些数据.
- return line.toString();
- return null;
- }
- //定义关闭资源方法.
- public void close()throws IOException{
- fr.close();
- }
- }
- class MyBufferedReaderTest
- {
- public static void main(String[] args)throws IOException{
- MyBufferedReader mbr = new MyBufferedReader(new FileReader("abc.txt"));
- String line = null;
- while((line=mbr.readLine())!=null){
- System.out.println(line);
- }
- mbr.close();
- }
- }
复制代码 |