黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader

------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

          

      黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader

/*

字符流的缓冲区技术:

对于一些大文件,如果读取一个字符才写一个字符,读写操作过于频繁。

为了解决这个问题,引入了缓冲区技术。

缓冲区技术是在流的基础上(必须要先有流)增强了流对于数据的操作效率。

就如同在水龙头上拿水喝,原本是一滴一滴喝的,但是现在用了一个杯子装着来喝,更有效率。

*/

 

import java.io.*;
class   Ioliou7
{
         public   static  void   main(String[] args)
         {
                   FileWriter   fw=null;
                   BufferedWriter    bfw=null;
                   try
                   {
                      fw=new FileWriter("f:\\yuyuyu.txt");
                      bfw=new BufferedWriter(fw);
                   //把写入流对象传给缓冲区构造函数
                      bfw.write("假面骑士01号登场!");
                   //实际上把字符写入流的还是fw调用底层资源实现的
                   bfw.newLine();
                   //换行
                     bfw.write("假面骑士02号登场!");
                      bfw.flush();
                   //这里还是要刷新才把存在流的数据传倒文件里面
                  
                   }
                   catch(IOException  e)
                   {
                            throw   new RuntimeException("写操作有误");
                   }
                   finally
                   {
                            try
                            {
                            if(bfw!=null)
                            {
                          bfw.close();
                          //关闭流,
                   /*
                   bfw.close();本质上关闭流的还是fw底层调用close()方法实现的,
                   所以就不用再写fw.close();了
                   */              
           }                                   
                            }
                            catch(IOException   e)
                            {
                                     throw  new  RuntimeException("bfw.close();出问题抛出异常了");
                            }
                   }
 
         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);                             
         }
}

——————分割线——————

 

/*

字符流的读取缓冲区技术

BufferedReader

 

 

*/

import  java.io.*;
class  Ioliou8
{
         publicstatic void main(String[] args)
         {
                   FileReader   fr=null;
       BufferedReader   bfr=null;
                   try
                   {
                      fr=new  FileReader("e:\\JAVAwenjian\\Ioliou8.java");
          bfr=new   BufferedReader(fr); 
                  
                   String   s=null;
                   while((s=bfr.readLine())!=null)
                   /*
                   readLine()一行一行的读取,不包含任何行终止符,如果没有数据读取就返回null,
                   但是不返回回车符,所以输出打印或者写入的时候要记得换行。
                   readLine读取数据本质上还是要调用read方法一个一个读取的
                   */
                   {
           soc(s);
                   }
                           
                   }
                   catch(IOException  e)
                   {
                            throw  new RuntimeException("读操作出问题");
                   }
                   finally
                   {
                        try
                        {
                                      if(bfr!=null)
                                        bfr.close();
                        }
                        catch (IOException  e)
                        {
                                throw new  RuntimeException("读操作出问题");
                        }
                   }
 
         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);                                
         }
}

————————分割线————

 

/*

字符流利用缓冲区进行复制操作文件

把e:\\JAVAwenjian\\Ioliou8.java复制到d盘中。

 

*/

import java.io.*;
class  Ioliou9
{
         public   static  void  main(String[] args)
         {
         FileWriter  fw=null;
         FileReader  fr=null;
         BufferedWriter  bfw=null;
         BufferedReader  bfr=null;
       try
       {
                     fw=new FileWriter("d:\\Ioliou8_copy.java");//建立字符流写入对象
                     fr=new FileReader("e:\\JAVAwenjian\\Ioliou8.java");//建立字符流读取对象
                     bfw=new  BufferedWriter(fw);//建立字符流写入缓冲区
                     bfr=new  BufferedReader(fr);//建立字符流读取缓冲区
 
         String   s=" ";
         while((s=bfr.readLine())!=null)
                     {
                        
                       bfw.write(s);
                            bfw.newLine();//换行
                     }
       
                           
       }
       catch (IOException  e)
       {
                            throw   new  RuntimeException("复制操作出问题");
       }
                   finally
                   {
                            try
                            {
                                     if(bfw!=null)
                                       bfw.close();
                            }
                            catch(IOException  e)
                            {
                                     throw   new RuntimeException(" bfw.close();出问题");
                            }
                     try
                     {
                              if(bfr!=null)
                                       bfr.close();
                     }
                     catch (IOException  e2)
                     {
                              throw new RuntimeException("bfr.close();出问题");
                     }
                  
                   }
 
 
         }
         public  static  void  soc(Object  obj)
         {
             System.out.println(obj);                          
         }
}

————————分割线——————

 

/*

建立一个自己的BufferedReader

这种设计模式也被称之为装饰设计模式,

自定义一个类把已有的对象传进来,

然后针对已有的功能进行强化。

*/

import java.io.*;
class  MyBufferedReader 
{
         private   FileReader  fr=null;
         MyBufferedReader(FileReader   fr)
         {
                this.fr=fr;               
         }
         StringBuffer   sb=new StringBuffer();
         public  String readLine()throws  IOException
         {
                   char   ch=' ';
        int  i=0;
                   while((i=fr.read())!=-1)
                   {
           if(i=='\r')
                continue;
                            if(i=='\n')
                return  sb.toString();
                       ch=(char)i;
                       sb.append(ch);
                  
             }
                   if(sb!=null)
            return  sb.toString();
                   return  null;
                   /*
                   sb.toString()返回的是容器内部的字符串,
                   写返回值的时候千万不要直接写return  sb
                   sb是StringBuffer型的容器!
              */
         }
         public  void  close()throws  IOException
         {
              fr.close();         
         }
         public  static void  soc(Object  obj)
         {
        System.out.println(obj); 
         }
        
}
class  Ioliou10
{
         public   static  void   main(String[] args) 
         {
                MyBufferedReader  bfr =null ;
                FileReader  fr=null;
                   try
                   {
                fr=new FileReader("f:\\yuyuyu.txt");
                bfr=new  MyBufferedReader(fr);
                     String  s=bfr.readLine();
                     soc(s); 
                   }
                   catch(IOException  e)
                   {
                            throw  new RuntimeException("操作异常");
                   }
                   finally
                   {
                       try
                       {
                                     if(bfr!=null)
                                       bfr.close();
                       }
                       catch (IOException  e)
                       {
                                     throw  new RuntimeException("bfr.close();出问题了");
                       }
                   }
 
 
                  
         }
         public  static void  soc(Object  obj)
         {
            System.out.println(obj);           
         }
}

——————分割线————

 

 

/*

装饰类的介绍:(装饰设计模式)

通常自定义一个类,传进已有的对象,然后增加已有的功能。

装饰类和被装饰类都有着相同的功能,只不过前者功能更强。

所以,一般装饰类和被装饰类在同一个体系中,

而且装饰类记得要覆盖父类的抽象方法,

注意是否要抛出异常。

*/

import java.io.*;
class  MyBufferedReader  extends  Reader
{
         private   FileReader  fr=null;
         MyBufferedReader(FileReader   fr)
         {
                this.fr=fr;               
         }
         StringBuffer   sb=new StringBuffer();
         public  String readLine()throws  IOException
         {
                   char   ch=' ';
                   int  i=0;
                   while((i=fr.read())!=-1)
                   {
                if(i=='\r')
                continue;
                            if(i=='\n')
                return  sb.toString();
                ch=(char)i;
                 sb.append(ch);
                  
             }
                   if(sb!=null)
                  return  sb.toString();
                   return  null;
         }
         public  void  close()throws  IOException
         {
              fr.close();         
         }
         public  static void  soc(Object  obj)
         {
        System.out.println(obj); 
         }
         //下面记得要覆盖Reader类中的抽象方法
 
         public  int  read(char[]   cbuf,int  off,int len)throws  IOException
         {
                   return   fr.read(cbuf,off,len);
                              
         }
 
}
class  Ioliou11
{
         public   static  void   main(String[] args) 
         {
              MyBufferedReader  bfr =null ;
               FileReader  fr=null;
                   try
                   {
               fr=new FileReader("f:\\yuyuyu.txt");
               bfr=new  MyBufferedReader(fr);
                     String  s=bfr.readLine();
                     soc(s); 
                   }
                   catch(IOException  e)
                   {
                            throw  new RuntimeException("操作异常");
                   }
                   finally
                   {
                       try
                       {
                                     if(bfr!=null)
                                       bfr.close();
                       }
                       catch (IOException  e)
                       {
                                     throw  new RuntimeException("bfr.close();出问题了");
                       }
                   }
 
 
                  
         }
         public  static void  soc(Object  obj)
         {
            System.out.println(obj);           
         }
}

——————分割线——————

 

/*

LineNumberReader类的应用:

该类是BufferedReader类的子类

*/

 

import java.io.*;
class  Ioliou12
{
         public  static void  main(String[] args)
         {
                   FileReader   fr=null;
                 LineNumberReader   lnr=null;
                   try
                   {
                      fr=new FileReader("Ioliou12.java");
                   //建立读取流对象
                      lnr= new  LineNumberReader(fr);
                  
                   String   s=" ";
                   lnr.setLineNumber(123);
                   //设置行号从123的后一行开始
                   while((s=lnr.readLine())!=null)
                   {    
                        soc(lnr.getLineNumber()+":"+s);
                             //getLineNumber方法用来获取行号
                      
                   }       
                   }
                   catch(IOException  e)
                   {
                            throw  new RuntimeException("读取操作出问题");
                   }
                   finally
                   {
                            try
                            {
                                     if(inr!=null)
                          lnr.close();        
                            }
                            catch(IOException  e2)
                            {
                                     throw   new RuntimeException("lnr.close();出问题了");
                            }
                            
                   }
 
                  
         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);                           
         }
}

编译运行结果如图1所示:

     图1


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值