p5 节点流和处理流

打印 上一主题 下一主题

主题 529|帖子 529|积分 1587

节点流 和 处理流


目录


  • 节点流和处理流一览图:

​                【图片来源】http://t.csdn.cn/d52a1
一、基本介绍


  • 节点流:节点流可以从一个特定的数据源读写数据,如FIleReader、FileWriter


  • 处理流:处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWriter。使用了修饰器设计模式。就是面向对象的封装思想,消除不同数据之间的差异性,仅对外暴露接口。


二、节点流 和 处理流 的区别和联系


  • 节点流是底层流/低级流,直接跟数据源相接。
  • 处理流(包装流)包装结点流,即可以消除不同节点的实现差异,也可以提供更方便的方法来完成输入输出。
  • 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
    1. /**
    2. * @author
    3. * @version 1.0
    4. * 模拟修饰器设计模式
    5. */
    6. public class Test_ {
    7.     public static void main(String[] args) {
    8.         BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
    9.         bufferedReader_.readFiles(10);
    10.         //希望通过BufferedReader_ 多次读取字符串
    11.         BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_());
    12.         bufferedReader_1.readStrings(5);
    13.     }
    14. }
    15. abstract class Reader_ {
    16.     public void readFile_(){}
    17.     public void readString_(){}
    18.     //在Reader_抽象类,使用read方法统一管理
    19. //    public abstract void read();
    20.     //后面在调用时就,利于对象动态绑定机制,绑定到对应的实现子类即可。
    21. }
    22. // 模拟节点流
    23. class FileReader_ extends Reader_{
    24.     public void readFile_(){
    25.         System.out.println("对文件进行读取……");
    26.     }
    27. //    public void read(){
    28. //        System.out.println("对文件进行读取……");
    29. //    }
    30. }
    31. //模拟节点流
    32. class StringReader_ extends Reader_{
    33.     public void readString_(){
    34.         System.out.println("读取字符串……");
    35.     }
    36. //    public void read(){
    37. //        System.out.println("读取字符串……");
    38. //    }
    39. }
    40. //模拟处理流/包装流
    41. class BufferedReader_ extends Reader_{
    42.     //注意装饰器模式中,装饰类和被装饰类(约定俗成,而非必须)继承自同一个父类。
    43.     private Reader_ reader_;//属性是 Reader_
    44.     //接收Reader_子类对象
    45.     public BufferedReader_(Reader_ reader_) {
    46.         this.reader_ = reader_;
    47.     }
    48.     public void readFile(){
    49.         reader_.readFile_();
    50.     }
    51.     //让方法更灵活,多次读取文件,或者加缓冲char[]....
    52.     public void readFiles(int num){
    53.         for (int i = 0; i < num; i++) {
    54.             reader_.readFile_();
    55.         }
    56.     }
    57.     //扩展 readString,批量处理字符串数据
    58.     public void readStrings(int num){
    59.         for (int i = 0; i < num; i++) {
    60.             reader_.readString_();
    61.         }
    62.     }
    63. }
    复制代码
三、处理流的功能主要体现在以下两个方面:


  • 性能的提高:主要以增加缓冲的方式来提高输入和输出的效率。
  • 操作的便捷:处理流提供了一系列便捷的方法来一次输入输出大批量的数据就,使用更加灵活方便。
四、处理流 — BufferedReader和BufferedWriter


  • BufferedReader 和 BufferedWriter属于字符流,是按照字符来读取数据的;
  • 关闭处理流,只需关闭外层流即可,关闭外层流(包装流)时会自动关闭包装的节点流;
  • BufferedReader 和 BufferedWriter 是安装字符操作,不要去操作二进制文件,可能造成文件损坏;

  • BufferedReader



    • 构造方法摘要
      Constructor and DescriptionBufferedReader(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入流。BufferedReader(Reader in, int sz)创建使用指定大小的输入缓冲区的缓冲字符输入流。
    • 方法摘要
      Modifier and TypeMethod and Descriptionvoidclose()关闭流并释放与之相关联的任何系统资源。Streamlines()返回一个 Stream ,其元素是从这个 BufferedReader读取的行。voidmark(int readAheadLimit)标记流中的当前位置。booleanmarkSupported()告诉这个流是否支持mark()操作。intread()读一个字符intread(char[] cbuf, int off, int len)将字符读入数组的一部分。StringreadLine()读一行文字。booleanready()告诉这个流是否准备好被读取。voidreset()将流重置为最近的标记。longskip(long n)跳过字符
    • 代码演示:
      1. import java.io.BufferedReader;
      2. import java.io.FileNotFoundException;
      3. import java.io.FileReader;
      4. import java.io.IOException;
      5. /**
      6. * @author
      7. * @version 1.0
      8. * 演示BufferedReader的使用
      9. */
      10. public class BufferedReader_ {
      11.     public static void main(String[] args) throws IOException {
      12.         String filePath = "e:\\a.java";
      13.         //创建BufferedReader对象
      14.         BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
      15.         //读取
      16.         String line;//按行读取,效率高
      17.         //1. bufferedReader.readLine() 是按行读取文件
      18.         //2. 当返回null时,表示文件读取完毕
      19.         while((line = bufferedReader.readLine()) != null){
      20.             System.out.println(line);
      21.         }
      22.         //关闭流
      23.         //这里注意,只需关闭 BufferedReader(外层流),因为底层会自动的去关闭节点流 FileReader
      24.         /**
      25.          * public void close() throws IOException {
      26.          *         synchronized (lock) {
      27.          *             if (in == null)
      28.          *                 return;
      29.          *             try {
      30.          *                 in.close();
      31.          *             } finally {
      32.          *                 in = null;// in 就是我们传入的 new FileReader(filePath),关闭了
      33.          *                 cb = null;
      34.          *             }
      35.          *         }
      36.          *     }
      37.          */
      38.         bufferedReader.close();
      39.     }
      40. }
      复制代码

    • BufferedWriter



      • 构造方法摘要
        Constructor and DescriptionBufferedWriter(Writer out)创建使用默认大小的输出缓冲区的缓冲字符输出流。BufferedWriter(Writer out, int sz)创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
      • 方法摘要
        Modifier and TypeMethod and Descriptionvoidclose()关闭流,先刷新。voidflush()刷新流。voidnewLine()写一行行分隔符。voidwrite(char[] cbuf, int off, int len)写入字符数组的一部分。voidwrite(int c)写一个字符voidwrite(String s, int off, int len)写一个字符串的一部分。
      • 代码演示:
        1. import java.io.BufferedWriter;
        2. import java.io.FileWriter;
        3. import java.io.IOException;
        4. public class BufferedWriter_ {
        5.     public static void main(String[] args) throws IOException {
        6.         String filePath = "e:\\BufferedWriter_.java";
        7.         BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));
        8.         bufferedWriter.write("hello, 你好");
        9.         //插入一个和系统 相关的换行
        10.         bufferedWriter.newLine();
        11. //        bufferedWriter.write("\r\n");
        12.         bufferedWriter.write("hello, 你好");
        13.         //关闭外层流即可,传入的节点流会自动关闭
        14.         bufferedWriter.close();
        15.     }
        16. }
        复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表