流中的高效字符串替换

问题描述 投票:0回答:1

我需要替换流式 http 响应中的字符串。这样做的天真的方法是

using var reader = new StreamReader(input, leaveOpen: true);
var original = await reader.ReadToEndAsync();
var replaced = original.Replace(old, new, StringComparison.InvariantCultureIgnoreCase);
await output.WriteAsync(Encoding.UTF8.GetBytes(replaced));

这是非常消耗资源和内存的,因为在替换字符串之前必须将完整的响应读入内存。

我一直在看

System.IO.Pipelines
PipeReader
。虽然这确实使我能够有效地访问流,但它适用于
byte
,这使得在 Utf-8 中工作时转换为 char 出现问题。

我见过的一种方法是在流读取器上使用

ReadLineAsync
,但我不知道流是否包含任何换行符。

我见过的另一种方法是使用队列,但即使这样也显得笨拙。

所以我的问题是:在不读取内存中的完整流的情况下替换流文本的最佳方法是什么?

c# .net stream
1个回答
0
投票

我的想法:

  1. 将旧值和新值转换为 2 字节数组。
  2. 从输入流中读取一些字节并填充缓冲区。
  3. 在缓冲区中搜索
    old[0]
    • 如果没有找到,则输出整个缓冲区,然后转到步骤2。
    • 如果找到,则比较
      old
      数组中的以下字节。
      • 如果找到完整的
        old
        序列,则先输出
        old[0]
        位置之前的字节,然后输出
        new
        数组中的字节。返回步骤 3。
      • 如果到达缓冲区末尾,首先输出
        old[0]
        位置之前的字节,然后将剩余字节移至缓冲区开头。转到步骤 2。
      • 如果某个字节不匹配,则返回步骤3并从下一个字节开始。
© www.soinside.com 2019 - 2024. All rights reserved.