黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

                    视频学习io装饰设计模式 

学习中痛并快乐,虽然程序中bug很多,但找出bug会很快乐!!!
(所谓的设计模式原来就是把原有的方法优化一下,听着很高上大,其实就是一种思想。)

package com.itheima.heima;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * 
 * 装饰设计模式的拓展 所谓的设计模式  就是对原有的方法进行优化
 * 
 * @author Administrator
 *
 *
 */
public class CustomBufferedReader {
           public static void main(String[] args) {
               //先别管这麽多,先声明一下,等下好关闭流
               FileReader  fr=null;
               MyBufferedReader  mbf=null;
                    try {
                    fr=new FileReader("C:\\Users\\Administrator\\Workspaces\\MyEclipse 8.5\\itheima\\src" +
                            "\\com\\itheima\\heima\\CustomBufferedReader.java");

                    mbf=new MyBufferedReader(fr);

                    String len=null;
                    while((len=mbf.myReadLine())!=null){
                        System.out.println(len);
                    }


                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    if(fr!=null)
                        try {
                            fr.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                }


            }
           }



//装饰类,相当于BufferedReader类
class MyBufferedReader  extends  Reader {

    private  Reader  rd;

     MyBufferedReader(Reader rd) {
        super();
        this.rd = rd;
    }

    //增强的方法  ,在原来的BufferedReader 的对象中  str=br.readLine();,返回也是String对象
    //在windows中  ,读取文本文件以   “\r\t”  为回车 
    public String myReadLine() {
        //定义一个字符串容器
        StringBuilder  sb=new StringBuilder();

        int len=-1;
        //读取字符流
        try {
            while((len=rd.read())!=-1){
                if(len=='\r')
                continue;
                if(len=='\n')
                return  sb.toString();
                else{
                    sb.append((char)len);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if(sb.length()!=0)
            return sb.toString();

        return  null;   


    }


    public void myClose() throws IOException{
        rd.close();
    }

    @Override
    public void close() throws IOException {
        // TODO Auto-generated method stub
        rd.close();
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Auto-generated method stub
        return read( cbuf,  off,  len);
    }
}

貌似这种网页,用着就像在做一个网页一样,用这个第四次哦写文章,感觉还不错~~~


                                               BufferedReaader装饰类的升级版LineNumberReader

LineNumberReader作为BufferedReader的升级版,它不仅具备BufferedReader的所有功能,同时他常用的方法:setLineNumber();设置行号初始值,getLineNumber();获取行号~~~~

package com.itheima.heima;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/**
 *
 * 带行号 的缓冲  区  功能上要比BufferedReader 的功能要强
 * 
 * LineNumberReader  也是一个装饰类  
 * 
 * @author Administrator
 *
 */
public class LineNumberReaderAdmin {

            public static void main(String[] args) {
                getLineNumberRaeder();  
            }

            private static void getLineNumberRaeder() {
                // TODO Auto-generated method stub
                //被装饰的对象
                FileReader fr=null;
                //装饰的对象
                LineNumberReader  lnr=null;
                try {
                    fr=new FileReader("C:\\Users\\Administrator\\Workspaces\\MyEclipse 8.5\\itheima\\src" +
                            "\\com\\itheima\\heima\\CustomBufferedReader.java");

                    lnr=new LineNumberReader(fr);
                    //可以设置行号的初始值
                    lnr.setLineNumber(1000);

                    String str=null;
                    try {
                        while((str=lnr.readLine())!=null){
                            //带行号的显示   getLineNumber()
                            System.out.println(lnr.getLineNumber()+":"+str);
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }


                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
}

                模拟LineNumberReader类

徒手封装一个MyLineNumberRaeder

package com.itheima.heima;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * 自定义LineNumberReader
 * 
 * @author Administrator
 *
 */
public class CustomLineNumberReader {
             public static void main(String[] args) {
                //别装饰的对象
                 FileReader fr=null;
                 //装饰的对象
                 MyLineNumberReader  mlnr=null;
                 try {
                    fr=new FileReader("C:\\Users\\Administrator\\Workspaces\\MyEclipse 8.5\\itheima"
                            +"\\src\\com\\itheima\\heima\\LineNumberReaderAdmin.java");

                    mlnr=new MyLineNumberReader(fr);
                    String myLineNumberMethod = null;
                    //设置初始值
                    mlnr.setMyLineNumber(2000);
                    try {
                        while((myLineNumberMethod=mlnr.myLineNumberMethod())!=null){
                            //自定义打印带行号的
                            System.out.println(mlnr.getMyLineNumber()+":"+myLineNumberMethod);
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }


}

//自定义类
class  MyLineNumberReader{
         //定义一个计数器
         private int myLineNumber=0;
         private Reader  rd;

        //get,set方法
        public int getMyLineNumber() {
            return myLineNumber;
        }
        public void setMyLineNumber(int myLineNumber) {
            this.myLineNumber = myLineNumber;
        }
        //把传进来对作用于本类对象
        public MyLineNumberReader() {
            super();
        }
        public MyLineNumberReader(Reader rd) {
            super();
            this.rd = rd;
        }

        public String  myLineNumberMethod() throws IOException{
            myLineNumber++;
            //定义一个容器,用来存储字符串
            StringBuilder  sb=new StringBuilder();
            //单个读取文件
            int read = -1;
            //循环读取
            while((read=rd.read())!=-1){
                if(read=='\r')
                    continue;
                if(read=='\n')
                    return sb.toString();
                else{
                    sb.append((char)read);
                }

            }
            //如果容器里还有,就返回~~~
            if(sb.length()!=0)
                return sb.toString();

            return  null;
        } 

        public void myClose() throws IOException{
            rd.close();
        }


}


----------
                   LineNumberRaeder的终极版 


> 又没发现自己正在做一件非常有意义的事情啊,~~~~


----------

package com.itheima.heima;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
* 自定义LineNumberReader的再次优化版
*
*
* @author Administrator
*
*/
public class CustomLineNumberReader {
public static void main(String[] args) {
//别装饰的对象
FileReader fr=null;
//装饰的对象
MyLineNumberReader mlnr=null;
try {
fr=new FileReader(“C:\Users\Administrator\Workspaces\MyEclipse 8.5\itheima”
+”\src\com\itheima\heima\LineNumberReaderAdmin.java”);

                mlnr=new MyLineNumberReader(fr);
                String myLineNumberMethod = null;
                //设置初始值
                mlnr.setMyLineNumber(2000);
                try {
                    while((myLineNumberMethod=mlnr.myLineNumberMethod())!=null){
                        //自定义打印带行号的
                        System.out.println(mlnr.getMyLineNumber()+":"+myLineNumberMethod);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(mlnr!=null)
                    try {
                        //继承父类的方法
                        mlnr.myClose();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }

        }

}

//自定义类
class MyLineNumberReader extends MyBufferedReader{
//定义一个计数器
private int myLineNumber=0;

    //get,set方法
    public int getMyLineNumber() {
        return myLineNumber;
    }
    public void setMyLineNumber(int myLineNumber) {
        this.myLineNumber = myLineNumber;
    }
    //把传进来对作用于本类对象
    public MyLineNumberReader(Reader rd) {
        //继承父类
        super(rd);
    }


    public String  myLineNumberMethod() throws IOException{
        myLineNumber++;
        //继承父类的方法
      return super.myReadLine();
    } 

}

“`

学习是一种信仰,优秀是一种习惯~~~~~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值