如何从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 ,并绕过MemoryStreamEncoding步骤。

干得好:

 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; }