如何从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; }