如何从string生成stream?
我需要编写一个unit testing,以获取来自文本文件的stream。 我想要做这样的事情:
Stream s = GenerateStreamFromString("a,b \nc,d");  public static Stream GenerateStreamFromString(string s) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; } 
不要忘记使用使用:
 using (Stream s = GenerateStreamFromString("a,b \nc,d")) { // ... Do stuff to stream } 
 关于StreamWriter没有被处置。  StreamWriter只是基本stream的包装,并没有使用任何需要处理的资源。  Dispose方法将closuresStreamWriter正在写入的基础Stream 。 在这种情况下,我们要返回的是MemoryStream 。 
 在.NET 4.5中,现在有一个StreamWriter的重载,它可以在编写器被StreamWriter保持底层stream的打开,但是这个代码做了同样的事情,并且也与其他版本的.NET一起工作。 
有没有什么办法可以在不closuresBaseStream的情况下closuresStreamWriter?
另一个scheme
 public static MemoryStream GenerateStreamFromString(string value) { return new MemoryStream(Encoding.UTF8.GetBytes(value ?? "")); } 
将其添加到静态string实用程序类:
 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; } 
这增加了一个扩展function,所以你可以简单地:
 using (var stringStream = "My string".ToStream()) { // use stringStream } 
 public Stream GenerateStreamFromString(string s) { return new MemoryStream(Encoding.UTF8.GetBytes(s)); } 
 使用MemoryStream类,调用Encoding.GetBytes首先将您的string变成一个字节数组。 
 你随后需要一个TextReader的stream? 如果是这样,你可以直接提供一个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; } 
我想你可以从使用MemoryStream中受益。 您可以使用通过使用Encoding类的GetBytes方法获得的string字节来填充它。
我使用了这样的答案组合:
 public static Stream ToStream(this string str, Encoding enc = null) { enc = enc ?? Encoding.UTF8; return new MemoryStream(enc.GetBytes(str ?? "")); } 
然后我使用它:
 String someStr="This is a Test"; Encoding enc = getEncodingFromSomeWhere(); using (Stream stream = someStr.ToStream(enc)) { // Do something with the stream.... } 
我们使用下面列出的扩展方法。 我认为你应该让开发者做出关于编码的决定,所以涉及的魔法就less了。
 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 ?? "")); } } 
 /// <summary> /// Get Byte[] from String /// </summary> /// <param name="str"></param> /// <returns></returns> public static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } /// <summary> /// Get Stream from String /// </summary> /// <param name="str"></param> /// <returns></returns> public static Stream GetStream(string str) { return new MemoryStream(GetBytes(str)); } 
string扩展的一个很好的组合:
 public static byte[] GetBytes(this string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } public static Stream ToStream(this string str) { Stream StringStream = new MemoryStream(); StringStream.Read(str.GetBytes(), 0, str.Length); return StringStream; }