我正在尝试找出BufferedReader的方法mark()
和reset()
真正有用吗?
我了解它们在做什么,但是对于在某些文本中来回走动我却从未使用过它们-通常,我通过读取字符序列或读取数组或 StringBuilder中的整行来解决此问题并来回穿梭。
我相信在 BufferedReader 和支持它的其他 Reader 实现中存在这些方法肯定有一定的原因,但是我无法做出为什么的假设。 / p>
使用mark()
和reset
与读取我们自己的数组中的数据并进行浏览相比,是否提供某些好处?
我已经搜索了我正在处理的一个大型项目(主要是使用 Spring Boot 的 Java 后端)的代码库,其中对类路径和唯一使用mark&reset方法的东西(仅在很少的库中)是在文本文件开头跳过可选的BOM字符。甚至对于这个简单的用例,我都觉得这样做有点设计。
此外,我还在Stackoverflow(例如What are mark and reset in BufferedReader?)上搜索其他教程,却找不到任何解释为什么真正使用 mark&reset 解决这类问题。所有代码示例仅说明方法在“ hello world”示例上的操作(无特殊原因,从流中的一个位置跳回到先前的位置)。在任何地方我都找不到任何解释,为什么有人应该在听起来更优雅且性能并不差的其他方式中实际使用它。
答案 0 :(得分:3)
我还没有亲自使用过它们,但是想到的一个案例是要将数据复制到需要正确调整大小的结构中。
在读取流并将数据复制到目标数据结构(可能是在解析之后)时,始终会遇到一个问题,即您不知道预先将目标设置为多大。标记/倒带功能使您可以标记,读取流,快速分析流以计算大小,重置,分配内存,然后重新解析复制数据。当然,还有其他方法可以做到这一点(例如,使用您自己的动态缓冲区),但是如果您的代码已经以Reader概念为中心,那么标记/重置可让您坚持使用。
也就是说,即使BufferedReader自己的readLine
方法也不使用此技术(它在内部创建了StringBuffer)。