【问题标题】:modified BufferedReader to ignore last line修改 BufferedReader 以忽略最后一行
【发布时间】:2010-10-13 18:50:24
【问题描述】:

我想使用 BufferedReader 之类的东西从文件中读取行,但如果文件中的最后一行不以换行符结尾,我希望它被忽略。标准的 BufferedReader 会将最后一行返回到 EOF,这不是我想要的。到目前为止,我想出的最好的办法是复制 BufferedReader 源代码,修改有关处理 EOF 的一行并将其命名为 BufferedCompleteLineReader 之类的东西。不过,这似乎不太好。有人有更好的主意吗?

背景是有多个阅读器请求读取定期附加新行文本的文件(即日志文件),但每个新行仅在以换行符结尾时才有效。如果我在修改最后一行时阅读它,我会得到错误的数据。但我不想强加文件锁定,因为性能对我来说比完整性更重要(对读者而言)。

【问题讨论】:

    标签: java


    【解决方案1】:

    子类化它并覆盖 readLine() 方法来做你想做的事。

    【讨论】:

    • 我最初是这么想的,但是 BufferedReader.readLine() 足够复杂,我最终还是要复制大部分课程,因为我确实想要缓冲。另外,我认为对子类添加约束违反了 Liskov 替换原则……这本身不会破坏交易,但会增加问题。
    • 你知道你可以调用 super.readLine() 并跳过最后一行吗?
    • 我认为这与直接使用 BufferedReader 并忽略最后一行是一样的,不是吗?大多数时候我确实想要最后一行,只是如果它没有以 EOL 字符终止(对不起,双重否定,我希望这是有道理的)
    【解决方案2】:

    您不能只在调用方执行此操作,您正在读取和处理数据吗?

    String nextLine = reader.readLine();
    String currentLine = nextLine;
    while ((nextLine = reader.readLine()) != null)
    {
        // Use currentLine here
    
        // Now we'll make sure we process the line we've just read on the
        // next iteration - so long as it wasn't the last line
        currentLine = nextLine;
    }
    

    【讨论】:

    • 我永远不会处理最后一行。大多数时候,我确实想要文件中的最后一行(仅在尚未完全写入时才忽略它,即没有 EOL 字符)
    • @David:处理完所有内容后,文件不会以换行符结尾吗?到那时,您不会从 BufferedReader 得到一个空行(您会忽略它)吗?如果最后一行是空的,我不记得它的行为是什么。
    • 它很像一个日志文件,所以它并没有真正结束。新行只是不断附加到它。因此 BufferedReader 非常适合读取直到最后一行的所有内容,并且大多数情况下它适用于读取最后一行,但如果当前正在写入最后一行并且它读取了部分行,则不是。
    • @David:所以如果它可能还没有完成,你最终将如何阅读最后一行?你能提供更多关于这方面的信息吗?
    • @Jon:抱歉,我更新了我原来的问题,以便更清楚地说明这一点。有多个阅读器,每个阅读器都发出多个读取文件的请求。因此,如果某些请求没有得到最后一行,那也没关系,因为它仍在编写中。一行写完之后,后续的请求都会看到。
    【解决方案3】:

    创建FilterReader 的自定义子类,并将其放在BufferedReader 和实际文件Reader/InputStream 之间。在您的过滤器阅读器中,在每个 read(char[]) 调用中存储最后几个字符的副本(我说最后一个 few 个字符,以防您需要处理超过 1 个字符的换行符,例如视窗)。读完最后一行后,检查 FilterReader 中存储的最后一个字符,看看它们是否代表换行符。

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多