我有一个案例,我需要在流中查看是否存在某个正则表达式,然后从流中读取数据。
标记和重置允许我这样做,但是如果 readAheadLimit 超出当前缓冲区的大小,我将面临标记无效的问题。
例如:我有一个缓冲区大小为 1k 的BufferedReader。
让我说我在缓冲区中的位置1000(标记= 1000 ),我需要在接下来的100个字符中检查正则表达式( readAheadLimit = 100 ) 。
因此,在读取时,当我越过当前缓冲区大小(1024)时,分配一个新缓冲区并且标记变为无效(无法重置)并且数据在正常情况下流入新缓冲区方式即可。
我认为这是预期的行为,但是有办法解决这个问题吗?
感谢您的帮助。
问候
答案 0 :(得分:2)
当我越过当前缓冲区大小(1024)时,会分配一个新缓冲区
不,不是。清除现有缓冲区并准备好再次使用。
不,它不会,除非你已超出预读限制。并且标记无效(无法重置)
您似乎没有阅读API。你可以用一个参数调用mark(),该参数说明在调用reset()之前你想要走多远,在这种情况下是100字节,并且需要API才能让你做到这一点。因此,当你最多提前100个字符时,调用reset(),当你调用mark()时,你就回到了原来的位置。如何在内部发生这不是你的问题,但肯定需要发生。
你是如何获得带有1k缓冲区的BufferedReader的?默认值为4096。
答案 1 :(得分:1)
至少有两个选择:
设置默认缓存大小远远超过1k:
new BufferedReader(originalReader,1024 * 1024)//例如1MB
应用自定义缓冲以在超过限制时立即增加缓存大小。如果您正在处理大量数据 - 自定义缓冲可以将数据存储在数据库或文件中。