`
444878909
  • 浏览: 637959 次
文章分类
社区版块
存档分类
最新评论

黑马程序员_<<字符流的缓冲技术和装饰类(BufferedWriter,BufferedReader,LineNumberReader)>>

 
阅读更多

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


1.BufferedWriter

BufferedWriter是利用的缓冲技术,操作的是输入流,把Writer对象构造函数的参数传入,首先是把信息读取到缓冲流中,然后再刷新缓冲流,把读到的文件信息传到目的地。这提高了写入的效率。

这里写入的方法增加了newLine()方法,换行,这个是跨平台的操作,不用在写”\r\n”,当关闭缓冲流,同时也关闭了缓冲流中封装的输入字符流。

缓冲区都有自己默认的长度,也可以自己设定长度,一般情况下,默认长度据够用了

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedDemo {
  public static void main(String[] args) {
    FileWriter fw=null;//字符流  输入流
    BufferedWriter bw=null;//缓冲流
    try {
       fw=new FileWriter("F:\\demo.txt");
       bw=new BufferedWriter(fw);//将字符流封装到缓冲流中
      for(int i=0;i<3;i++){
          bw.write("java0"+i);
          bw.newLine();//换行
          bw.flush();
       }
    } catch (IOException e) {
      e.printStackTrace();
    }finally{
      if(bw!=null){
         try {
           /*关闭缓冲流,同时也关闭了里面封装的字符流,不需要在关闭字符流,fw*/
           bw.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
      }
    }
 
  }
 
}
 


2.BufferedReader

1. 概述

读取缓冲流,将字符流的读取流传到BufferedReader对象的构造方法中,这样可以提高效率,在读取方面,除了一个一个字节读取和数组读取,增加了读行方法, readLine(),

缓冲区都有自己默认的长度,也可以自己设定长度,一般情况下,默认长度据够用了

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class BufferedDemo1 {
  public static void main(String[] args) {
    FileReader fr=null;//字符流输出流
    BufferedReader br=null;//缓冲流
    try {
      fr=new FileReader("F:\\demo.txt");
      br=new BufferedReader(fr);
      /*String readLine()当读取到末尾的时候,返回null
       * 否则返回的是一行的数据*/
      String line=null;
      while((line=br.readLine())!=null){
         System.out.println(line);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }catch(IOException e1){
      e1.printStackTrace();
    }finally{
      if(br!=null){
         try {
           /*关闭缓冲流,同时也关闭了里面的字符流,不需要在关闭字符流*/
           br.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
      }
    }
 
  }
 
}
结果:
java00
java01
java02


2.readLine原理

其实这是装饰类,用了装饰设计模式,详细参考 黑马程序员_<<装饰设计模式>>



模拟换行

 import java.io.FileReader;
import java.io.IOException;
 
public class MyBufferedReader {
  private FileReader fr = null;
 
  public MyBufferedReader(FileReader fr) {
    super();
    this.fr = fr;
  }
 
  /* 模拟readLine的话,其实里面封装了一个数组,我们为了方便,就封装StringBuilder对象,这样操作方便 */
 
  public String readLine() throws IOException {
    StringBuilder sb = new StringBuilder();
    int ch = -1;
    while ((ch = fr.read()) != -1) {
      //System.out.print(ch+",");  从输入的个数判断出
      if (ch == '\r')//当文件中就存在\r,那此时是否存入StringBuilder中呢,开始我认为是不会存入的,但是结果输出了,难道是读取的时候例如:\r,把\ 和 r分开读取了,这样理解的话,就通顺了
         continue;
      if (ch == '\n')//这里和\r的疑问和理解一样
         return sb.toString();
      else
         sb.append((char) ch);
 
    }
    if (sb.length() != 0)// 这里解决了,最后一样没有回车,防止最后一行不被输出
      return sb.toString();
    return null;
  }
 
  public void close() throws IOException {
    if (fr != null) {
      fr.close();
    }
  }
}
 
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
importjava.util.Random;
 
public classClassDemo {
      public static void main(String[] args) {
 
           MyBufferedReader br = null;// 缓冲流
           try {
                 br = new MyBufferedReader(newFileReader("F:\\demo.txt"));
 
                 String line = null;
                 while ((line = br.readLine())!= null) {
                      System.out.println(line);
                 }
           } catch (FileNotFoundException e) {
                 e.printStackTrace();
           } catch (IOException e) {
                 e.printStackTrace();
           } finally {
                 if (br != null) {
                      try {
                            br.close();
                      } catch (IOException e) {
                            e.printStackTrace();
                      }
                 }
           }
      }
 
}

结果正确输出。

3. 缓冲技术(复制文件)

package www.fuxi.IO;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedClass {
 
  public static void main(String[] args) {
    BufferedReader br = null;// 缓冲流读取
    BufferedWriter bw = null;// 缓冲流写入
    try {
      /* 在这里使用匿名类,因为关闭的不需要字符流对象,直接把对象封装到了缓冲流中了 */
      br = new BufferedReader(new FileReader("F:\\demo.txt"));
      bw = new BufferedWriter(new FileWriter("F:\\A\\demo.txt"));
      String line=null;
      while((line=br.readLine())!=null){//读取
         bw.write(line);//写入
         bw.newLine();//换行
         bw.flush();//刷新
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
 
      try {
         if (bw != null) {
           bw.close();
         }
         if (br != null) {
           br.close();
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
 
    }
 
  }
 
}

4. LineNumberReader

1. 概述

这也是一个装饰类。继承了BufferedReader类(这也是一个装饰了类),重写了ReadLine方法,增加了行号的设置和获得。

public class LineNumberDemo{
  public static void main(String[] args) {
    LineNumberReader lnr = null;
 
    try {
      lnr = new LineNumberReader(new FileReader("F:\\ClassDemo.java"));
      String line = null;
      lnr.setLineNumber(10);//在这里也可以自己设置行号的开始
      while ((line = lnr.readLine()) != null) {
        System.out.println(lnr.getLineNumber()+":"+line);
      }
    } catch (FileNotFoundException e) {
      System.out.println("没有找到指定的文件");
    } catch (IOException e) {
      System.out.println("读取失败");
    } finally {
      if (lnr != null) {
         try {
           lnr.close();
         } catch (IOException e) {
           System.out.println("流关闭失败");
         }
      }
    }
 
  }
 
}
 
部分结果:
11:package www.fuxi.IO;
12:
13:importjava.io.FileNotFoundException;
14:import java.io.FileReader;
15:import java.io.IOException;
16:
17:public class ClassDemo {
18: public static void main(String[] args) {
19:
20:   MyBufferedReaderbr = null;// 缓冲流



2. 模拟此类

自己不需要写readLine的原理,直接调用父类的方法即可,然后增加行号的设置和获得。

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/*自定义的可以设置行号读取类*/
public class MyLineNumberReader extends BufferedReader {
 
  private Reader r;// 读取流字符流
  private int LineNumber;// 行号
 
  public MyLineNumberReader(Reader r) {
    super(r);// 父类的构造方法
  }
 
  public int getLineNumber() {
    return LineNumber;
  }
 
  public void setLineNumber(int lineNumber) {
    LineNumber = lineNumber;
  }
 
  public String readLine() throws IOException {
    this.LineNumber++;// 每读取一行,行号就增加
    return super.readLine();
  }
 
  public void close() throws IOException {
    super.close();
  }
 
}
 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
 
public class LineNumberDemo {
  public static void main(String[] args) {
    MyLineNumberReader lnr = null;
 
    try {
      lnr = new MyLineNumberReader(new FileReader("F:\\ClassDemo.java"));
      String line = null;
      //lnr.setLineNumber(10);//在这里也可以自己设置行号的开始  默认的是从1开始
      while ((line = lnr.readLine()) != null) {
        System.out.println(lnr.getLineNumber()+":"+line);
      }
    } catch (FileNotFoundException e) {
      System.out.println("没有找到指定的文件");
    } catch (IOExceptione) {
      System.out.println("读取失败");
    } finally {
      if (lnr != null) {
         try {
           lnr.close();
         } catch (IOException e) {
           System.out.println("流关闭失败");
         }
      }
    }
 
  }
 
}
 
部分结果:
1:package www.fuxi.IO;
2:
3:importjava.io.FileNotFoundException;
4:import java.io.FileReader;
5:import java.io.IOException;
6:
7:public class ClassDemo {
8:  public static void main(String[]args) {


--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


分享到:
评论

相关推荐

    JI记事本

    &lt;br&gt;&lt;br&gt;import javax.swing.*; &lt;br&gt;import javax.swing.event.*; &lt;br&gt;import java.awt.*; &lt;br&gt;import java.awt.event.*; &lt;br&gt;import java.io.*; &lt;br&gt;import java.awt.color.... &lt;br&gt;} &lt;br&gt;} &lt;br&gt;//文件过滤类怎么写!

    BufferedReader 和BufferedWriter 实例

    NULL 博文链接:https://lisanlai.iteye.com/blog/673253

    AIC的Java课程1-6章

    第3版 机械工业出版社&lt;br&gt; 教学内容和要求&lt;br&gt;知识点 重要程度 使用频度 ...类 高 中 难&lt;br&gt;异常和断言 高 高 难&lt;br&gt;常用类 高 很高 中&lt;br&gt;基本数据结构 高 很高 难&lt;br&gt;集合 很高 很高 难&lt;br&gt;IO和串行化 高 中 难&lt;br&gt;...

    字节流字符流练习

    字节流与字符流的练习文档,内附一个简要的记事本综合文档。

    Java中BufferedReader与BufferedWriter类的使用示例

    BufferedReader与BufferedWriter分别继承于Reader和Writer类,分别为字符的读取和写入添加缓冲功能,这里我们就来看一下Java中BufferedReader与BufferedWriter类的使用示例:

    Java BufferedWriter BufferedReader 源码分析

    本文是关于Java BufferedWriter ,BufferedReader 简介、分析源码 对Java IO 流深入了解,希望看到的同学对你有所帮助

    文件读写 BufferedReader BufferedWriter 示例 去除代码后面多余空格

    文件读写 BufferedReader BufferedWriter 去除代码后面空格 简单 readLine newLine flush

    IO基础(字符流)

    文章目录IO基础(字符流)一、字符流二、常用的字符流类的继承关系三、字符流 FileReader 和 FileWriter四、字符缓冲流 BufferedReader 和 BufferedWriter五、 字符字节转换流(InputStreamReader/...

    BufferedWriter 介绍_动力节点Java学院整理

    BufferedWriter 是缓冲字符输出流。它继承于Writer。 BufferedWriter 的作用是为其他字符输出流添加一些缓冲功能。

    IO流之缓冲流

    字符输入缓冲 BufferedReader 字符输出缓冲 BufferedWriter 【重点】 所有的缓冲流都没有任何的读取写入文件的能力,都需要对应的输入流和输出流来提供对应的能力 在创建缓冲流对象时,需要传入对应的输入流对象和...

    JDK_API_1_6

    BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 ...

    java中的IO操作总结(一)

    java中的IO操作总结(一) 所谓IO,也就是Input与Output的缩写。在java中,IO涉及的范围比较大,这里主要讨论针对文件...BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率 解压密码 www.jiangyea.com

    用java IO流复制文本内容(包含中文字符)

    BufferedReader/BufferedWriter 实现从字节流到字符流的读取。代码用来实现文本内容的复制!

    java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流

    目录java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流字节缓冲流 —BufferedInputStream&BufferedOutputStream字符缓冲流—BufferedReader&BufferedWriter转换流—InputStreamReader&...

    IO输入输出体系.rar

    简单来说就是容许字节流直接操作基本数据类型和字符串 DataInputStream out = new DataInputStream(new BufferedInputStream(new FileInputStream("数据存储文件路径"))) DataOutputStream out = new ...

    Java之IO流学习总结

    InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类...

    IO流中数据传递的字节流和字符流

    IO的字符和字节流的运用字符流(适用于中文内容读入写出)读入:FileReader\BufferedReader写出:FileWriter\BufferedWriter字节流(适用于少量中文;主用图片,视频)第一种:用 FIle类搭配 FIleOutputStream的方法进行...

    java_文件复制(带有编码类型)

    BufferedWriter BufferedReader 具体例子

    Java文件读写操作函数实现

    * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值足够大。 * 通常,Reader 所作的每个读取请求都会导致对底层...

    IO流各个类的使用方法

    介绍了,下面这些类的具体使用方法,非常详细,值得一看 File FileFilter RandomAccessFile 【字节流】 InputStream OutputStream FileInputStream FileOutputStream DataInputStream DataOutputStream ...

Global site tag (gtag.js) - Google Analytics