我在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()
来获取的副本,只是有效数据作为新的字节数组。