我需要为一个方法编写一个单元测试,该方法采用来自文本文件的流。我想做这样的事情:
Stream s = GenerateStreamFromString("a,b \n c,d");
我需要为一个方法编写一个单元测试,该方法采用来自文本文件的流。我想做这样的事情:
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:
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?
其他回答
将此添加到静态字符串实用程序类:
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
}
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?
ToStream扩展方法的现代化和轻微修改版本:
public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8);
public static Stream ToStream(this string value, Encoding encoding)
=> new MemoryStream(encoding.GetBytes(value ?? string.Empty));
修改建议在@Palec的评论@肖恩鲍威的回答。
或者作为一行语句(由@satnhak建议):
public static Stream ToStream(this string value, Encoding encoding = null)
=> new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(value ?? string.Empty));
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;
}
给你:
private Stream GenerateStreamFromString(String p)
{
Byte[] bytes = UTF8Encoding.GetBytes(p);
MemoryStream strm = new MemoryStream();
strm.Write(bytes, 0, bytes.Length);
return strm;
}