jsm*_*ith 24 c# memorystream streamwriter
我不确定我做错了什么,看过很多例子,但似乎无法让这个工作.
public static Stream Foo()
{
var memStream = new MemoryStream();
var streamWriter = new StreamWriter(memStream);
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
Run Code Online (Sandbox Code Playgroud)
我正在对这个方法进行一个简单的测试,试图让它通过,但无论如何,我的收集计数为0.
[Test]
public void TestStreamRowCount()
{
var stream = Foo();
using (var reader = new StreamReader(stream))
{
var collection = new List<string>();
string input;
while ((input = reader.ReadLine()) != null)
collection.Add(input);
Assert.AreEqual(6, collection.Count);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我在上面修改了一些语法而没有在Test方法中进行编译.更重要的是第一种似乎返回空流的方法(我的reader.ReadLine()总是读取一次).不确定我做错了什么.谢谢.
ang*_*son 58
您忘记刷新StreamWriter实例了.
public static Stream Foo()
{
var memStream = new MemoryStream();
var streamWriter = new StreamWriter(memStream);
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
streamWriter.Flush(); <-- need this
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
Run Code Online (Sandbox Code Playgroud)
还要注意,StreamWriter应该将其处理掉,因为它实现了IDisposable,但这反过来会产生另一个问题,它也将关闭底层MemoryStream.
你确定要回到MemoryStream这里吗?
我会将代码更改为:
public static byte[] Foo()
{
using (var memStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memStream))
{
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
streamWriter.Flush();
return memStream.ToArray();
}
}
[Test]
public void TestStreamRowCount()
{
var bytes = Foo();
using (var stream = new MemoryStream(bytes))
using (var reader = new StreamReader(stream))
{
var collection = new List<string>();
string input;
while ((input = reader.ReadLine()) != null)
collection.Add(input);
Assert.AreEqual(6, collection.Count);
}
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*kov 12
由于您没有使用"using"或streamWriter.Flush(),因此编写器未提交对流的更改.结果Stream itslef还没有数据.通常,您希望使用Stream包装Stream和StremaWriter实例的操作.
您还应该考虑返回MemoryStream的新实例:
using(var memStream = new MemoryStream())
{
....
return new MemoryStream(memStream.ToArray(), false /*writable*/);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37812 次 |
| 最近记录: |