• javaIO——LineNumberReader


      LineNumberReader 是java字符流中的一员,它继承自 BufferedReader,只是在 BufferedReader 基础上,提供了对当前流位置所在文本行的标记记录。先来看看定义:

        

      可以看出,其定义了一个 lineNumber 字段对当前所在行进行记录。注释中红框说明了:setLineNumber(int) 方法仅仅是改变从 getLineNumber() 返回的值而已,而不会改变流的当前位置。也就是说 lineNumber 只是一个记录值,并不影响流的读取过程。

      下面贴一下 read 方法:

        

        public int read() throws IOException {
            synchronized (lock) {
                int c = super.read();
                if (skipLF) {
                    if (c == '
    ')
                        c = super.read();
                    skipLF = false;
                }
                switch (c) {
                case '
    ':
                    skipLF = true;
                case '
    ':          /* Fall through */
                    lineNumber++;
                    return '
    ';
                }
                return c;
            }
        }
    
    
        public int read(char cbuf[], int off, int len) throws IOException {
            synchronized (lock) {
                int n = super.read(cbuf, off, len);
    
                for (int i = off; i < off + n; i++) {
                    int c = cbuf[i];
                    if (skipLF) {
                        skipLF = false;
                        if (c == '
    ')
                            continue;
                    }
                    switch (c) {
                    case '
    ':
                        skipLF = true;
                    case '
    ':      /* Fall through */
                        lineNumber++;
                        break;
                    }
                }
    
                return n;
            }
        }
    
    
    
        public String readLine() throws IOException {
            synchronized (lock) {
                String l = super.readLine(skipLF);
                skipLF = false;
                if (l != null)
                    lineNumber++;
                return l;
            }
        }

      可以看出,都是通过调用父类 BufferedReader 的 对应方法,然后根据对换行符的判断,进行行数的增长操作。值得注意的是,行数记录的是外部使用者真正获得数据的流位置所在的行,而不是缓存位置所在的行

      总结起来就是,LineNumberReader 是可以记录当前数据所在行号的字符缓冲输入流。

  • 相关阅读:
    [Debug] Make python2.7 use the right version of opencv
    路线图 | 学习OpenCV路线图
    学习笔记 | Princeton
    书单 | 2017年阅读书单
    路线图 | 摄影师成长路线
    学习笔记 | Morvan
    如何在pycharm中进入shell脚本调试代码
    python3运行报错:TypeError: Object of type 'type' is not JSON serializable解决方法(详细)
    动态规划的引入 P1616 疯狂的采药【完全背包】
    动态规划的引入 P1048 采药【01背包】
  • 原文地址:https://www.cnblogs.com/coding-one/p/11377347.html
Copyright © 2020-2023  润新知