【问题标题】:Read all lines with BufferedReader and not empy it [duplicate]使用 BufferedReader 读取所有行而不是清空它[重复]
【发布时间】:2019-10-17 00:17:01
【问题描述】:

BufferedReader 具有来自套接字的数据的对象。如何在不删除的情况下获取整个 BufferedReader 内容。我需要它来进行追踪。

【问题讨论】:

    标签: java bufferedreader


    【解决方案1】:

    您应该mark() 开始缓冲区位置,以便您的reset() 调用回到开头。例如,如果您正在阅读 chars,并且想要标记一个位置以返回:

    数据样本:A B C D

    System.out.println((char)buffer.read());
    System.out.println((char)buffer.read());
    buffer.mark(4); // save the position
    System.out.println((char)buffer.read());
    System.out.println((char)buffer.read());
    buffer.reset() // back to 4
    System.out.println((char)buffer.read());
    System.out.println((char)buffer.read());
    

    将打印:

    A B C D C D

    (因为一个 char 需要 2 个字节)

    【讨论】:

    • 在这个用例中不使用mark 需要BufferedReader 分配一个足够大的缓冲区来容纳整个流吗?来自readAheadLimit 参数文档:“限制在仍保留标记的同时可以读取的字符数。在读取字符达到此限制或超出此限制后尝试重置流可能会失败。限制值更大大于输入缓冲区的大小将导致分配一个新的缓冲区,其大小不小于限制。因此应谨慎使用大值"。
    • 是的,但我认为这没有任何问题。如果他读取 bufferedreader 的流直到结束,并且每次到达结束时,它都会重置位置并保存其内容(以某种方式),那么这个逻辑对于必须重置(清空和填充)的 BufferedReader 也是有效的,例如阅读 10000 页日志),因为您每次都在“回滚”每个“流片”。
    • 嗯,我不确定我是否理解您的评论。据我了解文档,如果输入的大小为千兆字节,则需要分配一个千兆字节大小的缓冲区,以支持在读取到结尾后重置回开始(我相信这是 OP 想要做的)。最重要的是,OP 可能需要提前知道 readAheadLimit 的好值,以免它太小或不必要地大(从而导致分配不必要的大缓冲区)。
    • 如果有一个 1 GB 的输入,他必须回滚并作为一个整体获得,那么是的......当然,他需要在某处分配一个 1GB 的“完整”缓冲区:)。我的意思是,你可以用 bufferedReader 做同样的事情来保存它的内容:如果缓冲区在 1GB 读取(100MB 块)期间被填充和清空 10 次,那么他可以使用相同的逻辑,并将内容保存 10 次,在其他地方(压缩,也许?),每次缓冲区充满 100mb。但是,如果他想将 1 GB 的内容保存在 ONE 缓冲区中,那又是一个我无法解决的问题! :)
    猜你喜欢
    • 2015-05-12
    • 2022-07-13
    • 2018-06-16
    • 2010-09-07
    • 2013-03-23
    • 2017-11-18
    • 1970-01-01
    • 2016-11-03
    • 2012-11-12
    相关资源
    最近更新 更多