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

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

/*

字符流的缓冲区技术:

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

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

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

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

*/

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 17:18:06

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

黑马程序员——I/O流基础知识

I/O流 Io流 代表有能力产生数据的数据源对象或者有能力接收对象的数据接收端对象.字节流和字符流.中文字符也转编码表,jbk2万多中文字.unicode全世界的字符收录.乱码,两种不同形式的编码表.字符流里面的对象融合了编码表,以便别人使用的使用用你指定的编码方式. 基类:读和写~ 字节流 InputStream,OutputStream 字符流 Reader,Writer Writer 主力方法是writer().既然IO流是操作数据的,而数据的最常见体现形式是:文件. 需求:准备在硬盘上创

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp

黑马程序员——java——IO流——将一些字符写入到指定硬盘上的目录中去:

将一些字符写入到指定硬盘上的目录中去: import java.io.*; //将一些文字储存到硬盘的文件中去 //操作的是文字,因此选用字符流来操作 public class FileWriterDemo { public static void main(String[] args) { //创建一个可以往文件中写入字符数据的字符输出流对象 //既然是往一个文件中写入文字数据,那么在创建对象时,就必须明确该文件(用于存储数据的目的地) //如果文件不存在,则会自动创建 //如果文件存在,则会

黑马程序员-Java IO流

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概述 Java中与IO相关的类有很多,都集中在java.io中,都是以流的形式操作的,流是有一定的顺序,像一个管道一样,它的本质是传输数据.根据数据类型的不同可以分为字节流和字符流,根据流向的不同可以分为输入流和输出流. 字符流:因为数据有不同的编码,可以对字符进行不同的操作,其本质还是基于字节流,然后再查询相应的码表.一般用于处理纯文本数据. 字节流:可以处理所有类型数据,二进制文件(图片,音频等). 输入

黑马程序员&mdash;&mdash;9 IO流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO 一.概念:IO流即InputOutput的缩写,来处理设备间的数据传输 1.特点:对数据的操作通过流的方式,分为字节流和字符流输入流输出流 2.IO流的常用基类:字节流的抽象基流:InputStream和OutputStream  字符流的抽象基流:Reader和Writer 注:此四个类派生出来的子类名称都是以父类名作为子类名的后缀,以前缀为其功能:如InputStream子类File

黑马程序员——java IO流

java中,IO流需要操作系统资源,使用完毕后要释放资源. IO流根据操作的数据的类型的不同,可以分为字节流和字符流, 字符流是基于字节流的. 字符流的顶层基类是Reader和Writer 字节流的顶层基类是InputStream和OutputStream 流是用来操作数据的,数据的最常见形式是文件,字符流针对的是文本文件,字节流针对的是二进制文件(如图片文件). 1.FileWriter是Writer的一个子类,创建FileWriter对象后,如果源文件不存在则创建新文件:如果源文件存在则覆盖

JAVA学习笔记(三十二)- 字符流 FileReader &amp; FileWriter

标题 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream;

黑马程序员_JavaSE学习总结第27天_反射 &amp; 设计模式 &amp; JDK5、7、8新特性

------- android培训.java培训.期待与您交流! ----------  27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数

Java基础-简单的字符流-FileReader,FileWriter

简介:如题 package com.cc.test; import java.io.FileReader; import java.io.FileWriter; public class TestChar { public static void main(String[] args) { FileReader fReader = null; FileWriter fWriter = null; try{ fReader = new FileReader("E:/Android/AndroidS