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

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

当前回答

public Stream GenerateStreamFromString(string s)
{
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
}

其他回答

使用MemoryStream类,调用Encoding。GetBytes首先将字符串转换为字节数组。

您随后是否需要流上的TextReader ?如果是这样,您可以直接提供一个StringReader,并绕过MemoryStream和Encoding步骤。

给你:

private Stream GenerateStreamFromString(String p)
{
    Byte[] bytes = UTF8Encoding.GetBytes(p);
    MemoryStream strm = new MemoryStream();
    strm.Write(bytes, 0, bytes.Length);
    return strm;
}

我们使用下面列出的扩展方法。我认为您应该让开发人员对编码做出决定,这样就不会有什么神奇的事情发生。

public static class StringExtensions {

    public static Stream ToStream(this string s) {
        return s.ToStream(Encoding.UTF8);
    }

    public static Stream ToStream(this string s, Encoding encoding) {
        return new MemoryStream(encoding.GetBytes(s ?? ""));
    }
}
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:

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

关于StreamWriter没有被处理。StreamWriter只是一个基本流的包装器,不使用任何需要被处理的资源。Dispose方法将关闭StreamWriter写入的底层流。在本例中,这就是我们想要返回的MemoryStream。

在。net 4.5中,现在有一个StreamWriter的重载,它在写入器被处理后保持底层流打开,但是这段代码做同样的事情,也适用于其他版本的。net。

是否有办法关闭一个StreamWriter而不关闭它的BaseStream?

我认为您可以从使用MemoryStream中受益。您可以使用使用Encoding类的GetBytes方法获得的字符串字节填充它。