将流输出捕获到字符串

时间:2012-07-12 23:25:07

标签: c# .net

我正在调用一个写入流的库方法。但我想写一个字符串。这可能吗? (我不控制我正在调用的方法的源代码,所以改变它不是一个选项。)

试验,我试过这样的事情:

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()方法在完成后关闭流。

还有其他选择吗?

3 个答案:

答案 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();