通过StringWriter写入MemoryStream会将空字符添加到流中



我在c#中有一些代码,我试图通过StringWriter示例代码写入MemoryStream:

using (MemoryStream stream = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter())
{
writer.WriteLine("SELECT");
writer.WriteLine("tT.*");
writer.WriteLine("FROM");
writer.WriteLine("t[A Table] T");
writer.WriteLine("WHERE");
writer.WriteLine($"tT.[Data Field] IN ({data})");
}
....
return new MemoryStream(stream.GetBuffer());
}

当我检查stream的内容时,我看到。net框架在缓冲区的末尾添加了额外的0字节,使其达到256字节。我在MSDN帮助中找不到任何东西,这是令人费解的。

为了解决这个问题(使用上面的例子),我做了以下操作:
string crlf = Environment.NewLine;

string value = $"SELECT{crlf}";
value += $"tT.*{crlf}";
value += $"FROM{crlf}";
value += $"t[A Table] T{crlf}";
value += $"WHERE{crlf}";
value += $"tT.[Data Field] IN ({data})";

return new MemoryStream(Encoding.UTF8.GetBytes(value));

我宁愿使用流写入器,而不是建立一个字符串,然后调用Encoding.UTF8.GetBytes(value)

我已经尝试使用StringBuilder作为中间步骤,但它仍然将额外的字符添加到末尾。

您正在调用stream.GetBuffer(),它返回流写入的底层缓冲区-它几乎总是比流大。当写操作超过缓冲区的末尾时,缓冲区将自动扩展。

您可以使用stream.GetBuffer(),但考虑流长度,并有效地忽略超过该长度的任何字节-或者调用stream.ToArray()来获取的副本,只是有效数据作为新的字节数组。

最新更新