有一个问题我多年来一直想知道,我希望有人能给我一个答案,让我放松一下。
假设我有一个输入流(如文件/套接字/管道)并且想要解析传入的数据。让我们假设每个传入数据块都由换行符分割,就像大多数常见的互联网协议一样。这个应用程序也可以解析 html、xml 或任何其他智能数据结构。关键是数据通过分隔符而不是固定长度分成逻辑块。如何缓冲数据以等待分隔符出现?
答案似乎很简单:只要有一个足够大的字节/字符数组来容纳整个事物。
但是如果分隔符出现在缓冲区已满之后呢?这实际上是一个关于如何将动态数据块放入固定大小的块中的问题。我真的只能想到几个替代方案:
需要时增加缓冲区大小。这可能需要大量的内存重新分配,并且可能导致特制流的资源耗尽(或者甚至可能在我们想要保护自己免受耗尽攻击的套接字的情况下拒绝服务并丢弃试图耗尽资源的连接......和攻击者开始发送虚假的、超大的数据包以触发保护)。
使用循环缓冲区开始覆盖旧数据。也许不是一个理想的方法,因为逻辑块会变得不完整。
缓冲区已满时转储新数据。但是,这种方式永远找不到分隔符,所以这个选择显然不是一个好的选择。
只需将固定大小的缓冲区变大,并假设所有传入的逻辑数据块都在其范围内……如果它被填满,只需将整个缓冲区解释为逻辑块……
无论哪种情况,我都觉得我们必须假设逻辑块永远不会超过一定的大小......
对这个话题有什么想法吗?显然必须有一种方法,因为高级语言通过其readLine()
流方法提供了某种缓冲机制。
有没有“最好的方法”来解决这个问题,或者总是有一个权衡?我非常感谢关于这个主题的所有想法和想法,因为每次我需要编写某种解析器时,这个问题一直困扰着我。