我正在调用一个写入流的库方法。但我想写一个字符串。这可能吗? (我不控制我正在调用的方法的源代码,所以改变它不是一个选项。)
试验,我试过这样的事情:
iCalendarSerializer serializer = new iCalendarSerializer();
MemoryStream stream = new MemoryStream();
serializer.Serialize(new iCalendar(), stream, System.Text.Encoding.UTF8);
byte[] buff = new byte[stream.Length];
stream.Read(buff, 0, (int)stream.Length);
但是我在最后一行得到一个错误,那就是无法访问封闭的流。显然,Serialize()方法在完成后关闭流。
还有其他选择吗?
答案 0 :(得分:2)
byte[] buff = stream.ToArray()
怎么样?
答案 1 :(得分:1)
ToArray是从内存流中获取数据的另一种正确方法之一(另一种是GetBuffer和Length)。看起来你只想要字节数组大小的流数据和ToArray完全相同。
请注意,在已处置的流上调用这3个方法是安全的,因此您可以安全地将using(stream)
包裹在将某些数据写入流的代码周围。
在你的情况下,流看起来要通过序列化代码(.Serialize
)来处理。
iCalendarSerializer serializer = new iCalendarSerializer();
MemoryStream stream = new MemoryStream();
using(stream)
{
serializer.Serialize(new iCalendar(), stream, System.Text.Encoding.UTF8);
}
byte[] buff = stream.ToArray();
答案 2 :(得分:0)
在您的示例中,您需要在读取之前更改流的位置:
stream.Position = 0;
stream.Read(buff, 0, (int)stream.Length);
为了将流写入字符串,您可以使用StreamReader.ReadToEnd()方法:
var reader = new StreamReader(stream);
var text = reader.ReadToEnd();