【问题标题】:What are some real uses cases for the methods skip and reset in BufferedReader?BufferedReader 中的方法跳过和重置有哪些实际用例?
【发布时间】:2019-11-09 05:37:23
【问题描述】:

我想知道,BufferedReadermark()reset() 的方法到底有什么用处?

我了解他们在做什么,但在一些文本中来回切换我从未使用过它们 - 通常我通过读取一系列字符或数组中的整行或 StringBuilder 来解决这个问题em> 来回穿梭。

我相信这些方法出现在 BufferedReader 和支持它的其他 Reader 实现中一定有一些原因,但我无法做出假设。

与读取我们自己的数组中的数据并在其中导航相比,使用mark()reset 是否提供了一些好处?

我搜索了我正在处理的一个大型项目的代码库(主要是 Java 使用 Spring Boot 的后端),其中有很多依赖于类路径和唯一使用标记和重置方法的东西(仅在极少数库中)是在文本文件的开头跳过可选的 BOM 字符。即使对于这个简单的用例,我也觉得这样做有点做作。

此外,我正在寻找其他教程和 Stackoverflow(例如 What are mark and reset in BufferedReader?),但找不到任何解释为什么要使用 mark & reset 实际解决这些问题。所有代码示例仅解释了方法在“hello world”示例中所做的事情(从流中的一个位置跳回到前一个位置,没有特殊原因)。我找不到任何解释为什么有人应该在其他听起来更优雅且性能并不差的方式中实际使用它。

【问题讨论】:

  • “常见用例”很少。 22 年来我从未认真使用过它们(生产代码)。

标签: java io bufferedreader java-io


【解决方案1】:

我自己没有使用过它们,但我想到的一个例子是您想要将数据复制到需要正确调整大小的结构中。

在读取流并将数据复制到目标数据结构中时(可能在解析之后),您总是会遇到不知道提前将目标设为多大的问题。标记/倒带功能让您可以标记、读取流、快速解析它以计算大小、重置、分配内存,然后重新解析这次复制数据。当然还有其他方法(例如,使用您自己的动态缓冲区),但如果您的代码已经以 Reader 概念为中心,那么标记/重置可以让您保持不变。

也就是说,即使是 BufferedReader 自己的 readLine 方法也没有使用这种技术(它在内部创建一个 StringBuffer)。

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 2023-04-10
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多