0

我有一个案例,我需要在流中提前查看某个正则表达式的存在,然后从流中读取数据。

mark 和 reset 允许我这样做,但我面临一个问题,如果readAheadLimit超出当前缓冲区的大小,则标记变得无效。

例如:我有一个缓冲区大小为1k的 BufferedReader 。

假设我在缓冲区中的位置 1000 ( mark=1000 ),我需要在接下来的 100 个字符 ( readAheadLimit=100 )中检查正则表达式。

因此,在读取时,当我跨越当前缓冲区大小(1024)时,分配了一个新缓冲区并且标记变得无效(无法重置)并且数据以正常方式流入新缓冲区

我认为这是预期的行为,但有没有办法解决这个问题?

感谢你的帮助。

问候

4

2 回答 2

2

当我跨越当前缓冲区大小(1024)时,分配了一个新缓冲区

不,不是。现有缓冲区被清除并准备好用于其他用途。

并且标记变为无效(无法重置)

不,它没有,除非你已经超出了预读限制。

您似乎没有阅读过 API。您调用 mark() 时带有一个参数,该参数说明在调用 reset() 之前您想要走多远,在本例中为 100 个字节,并且需要 API 才能完全做到这一点。因此,当您提前多达 100 个字符时,调用 reset(),然后您又回到调用 mark() 时的位置。这在内部如何发生不是你的问题,但它肯定需要发生。

你是如何得到一个 1k 缓冲区的 BufferedReader 的?默认值为 4096。

于 2013-02-20T11:43:03.543 回答
1

至少有两种选择:

  1. 将默认缓存大小设置为远大于 1k:

    new BufferedReader(originalReader, 1024 * 1024) // 例如 1Mb

  2. 一旦超过限制,应用自定义缓冲以增加缓存大小。如果您正在处理大量数据 - 自定义缓冲可以将数据存储在数据库或文件中。

于 2013-02-19T06:41:48.003 回答