mark和readAheadLimit

时间:2013-02-19 06:37:34

标签: java inputstream iostream bufferedreader java-io

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

标记和重置允许我这样做,但是如果 readAheadLimit 超出当前缓冲区的大小,我将面临标记无效的问题。

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

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

因此,在读取时,当我越过当前缓冲区大小(1024)时,分配一个新缓冲区并且标记变为无效(无法重置)并且数据在正常情况下流入新缓冲区方式即可。

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

感谢您的帮助。

问候

2 个答案:

答案 0 :(得分:2)

  

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

不,不是。清除现有缓冲区并准备好再次使用。

  

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

不,它不会,除非你已超出预读限制。

您似乎没有阅读API。你可以用一个参数调用mark(),该参数说明在调用reset()之前你想要走多远,在这种情况下是100字节,并且需要API才能让你做到这一点。因此,当你最多提前100个字符时,调用reset(),当你调用mark()时,你就回到了原来的位置。如何在内部发生这不是你的问题,但肯定需要发生。

你是如何获得带有1k缓冲区的BufferedReader的?默认值为4096。

答案 1 :(得分:1)

至少有两个选择:

  1. 设置默认缓存大小远远超过1k:

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

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