这是我常用的一个简单解析器(通常在流式传输不是关键时,只需读取并使用 .Split 即可完成任务),不太优化但应该可以正常工作:
(更像是 Split 方法 - 更多注释请见下文)
public static IEnumerable<string> Split(this Stream stream, string delimiter, StringSplitOptions options)
{
var buffer = new char[_bufffer_len];
StringBuilder output = new StringBuilder();
int read;
using (var reader = new StreamReader(stream))
{
do
{
read = reader.ReadBlock(buffer, 0, buffer.Length);
output.Append(buffer, 0, read);
var text = output.ToString();
int id = 0, total = 0;
while ((id = text.IndexOf(delimiter, id)) >= 0)
{
var line = text.Substring(total, id - total);
id += delimiter.Length;
if (options != StringSplitOptions.RemoveEmptyEntries || line != string.Empty)
yield return line;
total = id;
}
output.Remove(0, total);
}
while (read == buffer.Length);
}
if (options != StringSplitOptions.RemoveEmptyEntries || output.Length > 0)
yield return output.ToString();
}
...而且如果需要,你只需简单地切换到字符分隔符,只要替换即可。
while ((id = text.IndexOf(delimiter, id)) >= 0)
...与
while ((id = text.IndexOfAny(delimiters, id)) >= 0)
(并使用id++
而不是id+=
以及签名this Stream stream,StringSplitOptions options,params char[] delimiters
)
...还可以删除空等等。
希望它能帮助到你。
Peek()
和StringBuilder
,你基本上是在复制StreamReader
内部的ReadLine()
操作... 所以我觉得它很慢很奇怪;你能发一下你尝试过的代码吗? - digEmAll