协慌网

登录 贡献 社区

如何从字符串生成流?

我需要为采用来自文本文件的流的方法编写单元测试。我想做这样的事情:

Stream s = GenerateStreamFromString("a,b \n c,d");

答案

public static Stream GenerateStreamFromString(string s)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

不要忘记使用 “使用”:

using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
    // ... Do stuff to stream
}

关于StreamWriter尚未处理。 StreamWriter只是基本流的包装,并且不使用任何需要处理的资源。 Dispose方法将关闭StreamWriter写入的基础Stream 。在这种情况下,我们要返回的是MemoryStream

在. NET 4.5 中, StreamWriter现在有一个重载,可以在处置编写器后使基础流保持打开状态,但是此代码执行相同的操作,并且也可以与其他版本的. NET 一起使用。

请参见是否可以在不关闭 StreamWriter 的 BaseStream 的情况下将其关闭?

另一个解决方案:

public static MemoryStream GenerateStreamFromString(string value)
{
    return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}

将此添加到静态字符串实用程序类:

public static Stream ToStream(this string str)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(str);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

这增加了扩展功能,因此您可以简单地:

using (var stringStream = "My string".ToStream())
{
    // use stringStream
}