• 93-Java的字符缓冲流、案例:出师表


    一、字符缓冲流

    • 字符缓冲输出流:BufferedWriter
      • 作用:提高字符输出流写数据的性能,

    在这里插入图片描述



    1、字符缓冲输入流:
    • BufferedReader类

    • 作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。


    (1)构造器
    构造器说明
    public BufferedReader(Reader r)可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高
    字符输入流读数据的性能

    (2)新增的方法
    方法名称说明
    public String readLine()读取一行数据返回,如果读取没有完毕,无行可读返回 null

    package com.app.d3_char_buffer;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.Reader;
    
    /**
     * 目标:学会使用字符缓冲输入流提高字符输入流的性能
     *      新增了按照行读取数据的方法(经典代码)
     */
    public class BufferedReaderDemo01 {
        public static void main(String[] args) {
            try (
                    // 1、创建一个字符输入流与源文件接通
                    Reader fr = new FileReader("day11-io2-app/src/data01.txt");
    
                    // a.将字符输入流管道包装成一个字符缓冲输入流管道
                    BufferedReader br = new BufferedReader(fr);
                    ) {
                
                // 2、循环每次读取一个字符数组的数据
                // 定义一个字符数组
                /*char[] buffer = new char[1024];     // 1K字符
                int len;    // 用于记录每次读取的数据字节
                while ( (len = fr.read(buffer)) != -1 ) {
                    String rs = new String(buffer, 0, len); // 解码
                    System.out.print(rs);
                }*/
    
                // 3、按照行读取数据,没有可读行返回null
                String line;    // 记录每行读取的数据
                // 循环读取:当读取到的行的下一行没有可读行时,说明为null,结束循环!
                while ( (line = br.readLine()) != null ) {
                    System.out.println(line);   // 每读取到一行数据就输出到控制台
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    package com.app.d7_char_stream;
    
    import java.io.FileReader;
    import java.io.Reader;
    
    /**
        目标:学会使用文件字符输入流,每次读取一个字符
     */
    public class FileReaderDemo01 {
        public static void main(String[] args) throws Exception {
            // 1、创建一个字符输入流管道与源文件接通
            Reader fr = new FileReader("day10-file-io-app/src/data05.txt");
    
            // 2、读取一个字符返回,没有可读的字符就返回 -1
            /*int code = fr.read();   // 返回的是字符的编码
            System.out.print((char) code);
    
            int code2 = fr.read();
            System.out.println((char) code2);*/
    
            // 3、循环改进
            int code;   // 用于记录每次读取到的字符的编码
            // 循环读取文件的字符,当字符读取完毕时,结束循环!
            while ( (code = fr.read()) != -1 ) {
                System.out.print((char) code);
            }
        }
    }
    
    爱a你就是2是ab?。@¥¥#@天哪!!
        爱a你就是2是ab?。@¥¥#@天哪!!
    爱a你就是2是ab?。@¥¥#@天哪!!
    
    爱a你就是2是ab?。@¥¥#@天哪!!
    爱a你就是2是ab?。@¥¥#@天哪!!
    爱a你就是2是ab?。@¥¥#@天哪!!
    
    Process finished with exit code 0
    
    



    2、字符缓冲输出流:
    • BufferedWriter类
    • 作用:提高字符输出流写取数据的性能,除此之外多了换行功能

    (1)构造器
    构造器说明
    public BufferedWriter(Writer w)可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高
    字符输出流写数据的性能

    (2)新增的方法
    方法名称说明
    public void newLine()换行操作

    package com.app.d3_char_buffer;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.Writer;
    
    /**
     * 目标:学会使用字符缓冲输出流提高字符输出流的性能
     *      新增了换行的功能
     */
    public class BufferedWriterDemo02 {
        public static void main(String[] args) {
            try (
                    // 1、创建一个字符输出流管道与目标文件接通
                    // Writer fw = new FileWriter("day11-io2-app/src/out02.txt");  // 覆盖管道:每写一次启动,就会将先前的数据覆盖
                    Writer fw = new FileWriter("day11-io2-app/src/out02.txt", true);    // 追加管道:在先前的数据之后追加数据
    
                    // a.把字符输出流管道包装成一个字符缓冲输出流管道
                    BufferedWriter bw = new BufferedWriter(fw);
                    ) {
    
                // a、写一个字符出去
                bw.write(97);
                bw.write('a');
                bw.write('中');  // 不会出现中文乱码
                bw.newLine();   // 换行
    
                // b、写一个字符串出去
                bw.write("123我是a中国人bvsdf.@#@之歌手动]]");
                bw.newLine();   // 换行
    
                // c、写一个字符数组出去
                char[] chars = "ab12我爱中国!".toCharArray();
                bw.write(chars);
                bw.newLine();   // 换行
    
                // d、写字符串的一部分出去
                bw.write("123我是a中国人bvsdf.@#@之歌手动]]", 0, 6);
                bw.newLine();   // 换行
    
                // e、写字符数组的一部分出去
                bw.write(chars, 4, 5);
                bw.newLine();   // 换行
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    在这里插入图片描述



    总结

    1、字符缓冲流为什么提高了操作数据的性能?

    • 字符缓冲流自带8K缓冲区
    • 可以提高原始字符流读写数据的性能

    2、字符缓冲流的功能如何使用?

    • public BufferedReader(Reader r)
      • 性能提升了,多了readLine()按照行读取的功能
    • public BufferedWriter(Writer w)
      • 性能提升了,多了newLine()换行功能


    二、字符缓冲流案例-出师表

    拷贝出师表到另一个文件,恢复顺序

    需求

    • 把《出师表》的文章顺序进行恢复到一个新文件中。
    • 以下是乱序的《出师表》
    3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
    1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
    5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
    2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
    4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
    6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
    9.今当远离,临表涕零,不知所言。
    7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
    8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
    

    分析

    1、定义一个缓冲字符输入流管道与源文件接通

    2、定义一个List集合存储读取的每行数据

    3、定义一个循环按照行读取数据,存入到List集合中

    4、对List集合中的每行数据按照首字符编号升序排序

    5、定义一个缓冲字符输出流管道与目标文件接通

    6、遍历List集合中的每个元素,用缓冲字符输出流管道写出并换行

    package com.app.d3_char_buffer;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * 字符缓冲流案例:出师表
     * 需求:
     *      把《出师表》的文章顺序进行恢复到一个新文件中
     */
    public class BufferedCharTest03 {
        public static void main(String[] args) {
            try (
                    // 1、定义一个缓冲字符输入流管道与源文件接通
                    BufferedReader fr = new BufferedReader(new FileReader("day11-io2-app/src/csb.txt"));
    
                    // 5、定义一个缓冲字符输出流管道与目标文件接通
                    BufferedWriter fw = new BufferedWriter(new FileWriter("day11-io2-app/src/newcsb.txt"));
                    ) {
    
                // 2、定义一个List集合存储读取的每行数据
                List<String> data = new ArrayList<>();
    
                // 3、定义一个循环按照行读取数据,
                String line;    // 记录每行读取的数据
                while ( (line = fr.readLine()) != null ) {
                    // 存入到List集合中
                    data.add(line);
                }
    
                // 4、对List集合中的每行数据按照首字符编号升序排序
                Collections.sort(data);
    
                // 6、遍历List集合中的每个元素,
                for (String datum : data) {
                    // 用缓冲字符输出流管道写出并换行
                    fw.write(datum);
                    fw.newLine();   // 换行
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    在这里插入图片描述


    在这里插入图片描述



    三、字符缓冲流拓展案例-出师表2

    拷贝出师表到另一个文件,恢复顺序

    需求

    • 把《出师表》的文章顺序进行恢复到一个新文件中。
    • 以下是乱序的《出师表》
    三.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
    
    一.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
    
    五.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
    
    二.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
    
    肆.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
    
    陆.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
    
    九.今当远离,临表涕零,不知所言。
    
    柒.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
    
    八.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
    

    分析

    1、定义一个缓冲字符输入流管道与源文件接通

    2、定义一个List集合存储读取的每行数据

    3、定义一个循环按照行读取数据,存入到List集合中

    4、定义List集合存储首字符

    5、对List集合中的每行数据按照首字符索引升序排序

    6、定义一个缓冲字符输出流管道与目标文件接通

    7、遍历List集合中的每个元素,用缓冲字符输出流管道写出并换行

    package com.app.d3_char_buffer;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * 字符缓冲流案例:出师表
     * 需求:
     *    把《出师表》的文章顺序进行恢复到一个新文件中
     */
    public class BufferedCharTest04 {
        public static void main(String[] args) {
            try (
                    // 1、定义一个缓冲字符输入流管道与源文件接通
                    BufferedReader fr = new BufferedReader(new FileReader("day11-io2-app/src/csb2.txt"));
    
                    // 6、定义一个缓冲字符输出流管道与目标文件接通
                    BufferedWriter fw = new BufferedWriter(new FileWriter("day11-io2-app/src/newcsb2.txt"))
    
                    ) {
    
                // 2、定义List集合存储读取到的每行数据
                List<String> data = new ArrayList<>();
    
                // 3、定义一个循环按照行读取数据,
                String line;    // 记录每行读取到的数据
                while ( (line = fr.readLine()) != null ) {
                    // 存入到List集合中
                    data.add(line);
                }
    
                // 4、定义List集合存储首字符
                List<String> sizes = new ArrayList<>();
                Collections.addAll(sizes, "一","二","三","肆","五","陆","柒","八","九");
    
                // 5、对List集合中的每行数据按照首字符索引升序排序
                // 自定义比较规则
                /*Collections.sort(data, new Comparator() {
                    @Override
                    public int compare(String o1, String o2) {
                        *//*. .... ...
                         *//*
                        // 获取每行首字符 0 到 “.” 的索引做比较
                        return sizes.indexOf(o1.substring(0, o1.indexOf(".")))
                                - sizes.indexOf(o2.substring(0, o2.indexOf(".")));
                    }
                });*/
    
                // 简化后:
                Collections.sort(data, (o1, o2) ->
                        sizes.indexOf(o1.substring(0, o1.indexOf(".")))
                                - sizes.indexOf(o2.substring(0, o2.indexOf(".")))
                );
    
                // 7、遍历List集合中的每个元素,
                for (String datum : data) {
                    // 用缓冲字符输出流管道写出并换行
                    fw.write(datum);
                    fw.newLine();   // 换行
                }
    
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    在这里插入图片描述


    在这里插入图片描述

  • 相关阅读:
    元宇宙虚拟展厅:沉浸式体验、个性化互动、全新展示
    【vue基础】黑马vue视频笔记(四)
    机器学习面试知识点总结
    三、CSS中级
    道可云元宇宙每日资讯|第九届元宇宙数字人设计大赛在京开幕
    filebeat实现实时采集日志
    Keras生成式学习(五)
    成都正信晟锦:亲戚借了钱不认账怎么办是现金
    在RVIZ中显示深度数据
    AI模型训练参数
  • 原文地址:https://blog.csdn.net/yelitoudu/article/details/127109572