zoukankan      html  css  js  c++  java
  • Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例

    1. 自定义类模拟LineNumberReader的获取行号功能案例

    2. 代码实现:

    (1)MyBufferedReader.java:

     1 package cn.itcast_08;
     2 
     3 import java.io.IOException;
     4 import java.io.Reader;
     5 
     6 /*
     7  * 用Reader模拟BufferedReader的readLine()功能
     8  * 
     9  * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
    10  */
    11 public class MyBufferedReader {
    12     private Reader r;
    13 
    14     public MyBufferedReader(Reader r) {
    15         this.r = r;
    16     }
    17 
    18     /*
    19      * 思考:写一个方法,返回值是一个字符串。
    20      */
    21     public String readLine() throws IOException {
    22         /*
    23          * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组
    24          * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
    25          * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。
    26          * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
    27          * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。
    28          * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder
    29          */
    30         StringBuilder sb = new StringBuilder();
    31 
    32         // 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
    33         
    34         
    35         /*
    36         hello
    37         world
    38         java    
    39         
    40         104101108108111
    41         119111114108100
    42         1069711897
    43          */
    44         
    45         int ch = 0;
    46         while ((ch = r.read()) != -1) { //104,101,108,108,111
    47             if (ch == '
    ') {
    48                 continue;
    49             }
    50 
    51             if (ch == '
    ') {
    52                 return sb.toString(); //hello
    53             } else {
    54                 sb.append((char)ch); //hello
    55             }
    56         }
    57 
    58         // 为了防止数据丢失,判断sb的长度不能大于0
    59         if (sb.length() > 0) {
    60             return sb.toString();
    61         }
    62 
    63         return null;
    64     }
    65 
    66     /*
    67      * 先写一个关闭方法
    68      */
    69     public void close() throws IOException {
    70         this.r.close();
    71     }
    72 }

    (2)MyLineNumberReader2.java:

     1 package cn.itcast_09;
     2 
     3 import java.io.IOException;
     4 import java.io.Reader;
     5 
     6 import cn.itcast_08.MyBufferedReader;
     7 
     8 public class MyLineNumberReader2 extends MyBufferedReader {
     9     private Reader r;
    10 
    11     private int lineNumber = 0;
    12 
    13     public MyLineNumberReader2(Reader r) {
    14         super(r);
    15     }
    16 
    17     public int getLineNumber() {
    18         return lineNumber;
    19     }
    20 
    21     public void setLineNumber(int lineNumber) {
    22         this.lineNumber = lineNumber;
    23     }
    24 
    25     @Override
    26     public String readLine() throws IOException {
    27         lineNumber++;
    28         return super.readLine();
    29     }
    30 }

    (3)测试类MyLineNumberReaderTest,如下:

     1 package cn.itcast_09;
     2 
     3 import java.io.FileReader;
     4 import java.io.IOException;
     5 
     6 public class MyLineNumberReaderTest {
     7     public static void main(String[] args) throws IOException {
     8         // MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader(
     9         // "my.txt"));
    10 
    11         MyLineNumberReader2 mlnr = new MyLineNumberReader2(new FileReader(
    12                 "my.txt"));
    13 
    14         // mlnr.setLineNumber(10);
    15 
    16         // System.out.println(mlnr.getLineNumber());
    17         // System.out.println(mlnr.getLineNumber());
    18         // System.out.println(mlnr.getLineNumber());
    19 
    20         String line = null;
    21         while ((line = mlnr.readLine()) != null) {
    22             System.out.println(mlnr.getLineNumber() + ":" + line);
    23         }
    24 
    25         mlnr.close();
    26     }
    27 }

    运行效果,如下:

  • 相关阅读:
    Python实现DES加密算法
    空循环,g++ O2优化
    java 高并发下超购问题解决
    原型模式
    Lambda速学
    观察者模式
    略读策略模式
    .net 字典的速学
    执行计划准备篇
    关于“策略模式”与“桥接模式”的问题
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4870836.html
Copyright © 2011-2022 走看看