使用StreamWriter写入MemoryStream将返回空

我不确定我做错了什么,看过很多例子,但似乎无法让这个工作。

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

我正在对这个方法进行一个简单的测试,试图让它通过,但无论如何,我的收集计数为0。

 [Test] public void TestStreamRowCount() { var stream = Foo(); using (var reader = new StreamReader(stream)) { var collection = new List(); string input; while ((input = reader.ReadLine()) != null) collection.Add(input); Assert.AreEqual(6, collection.Count); } } 

注意:我在上面修改了一些语法而没有在Test方法中进行编译。 更重要的是第一个方法似乎返回一个空流(我的reader.ReadLine()总是读取一次)。 不确定我做错了什么。 谢谢。

您忘记刷新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; } 

另请注意, 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 input; while ((input = reader.ReadLine()) != null) collection.Add(input); Assert.AreEqual(6, collection.Count); } } 

由于您没有使用“using”或streamWriter.Flush(),因此编写器未提交对流的更改。 结果Stream itslef还没有数据。 通常,您希望使用Stream包装Stream和StremaWriter实例的操作。

您还应该考虑返回MemoryStream的新实例:

 using(var memStream = new MemoryStream()) { .... return new MemoryStream(memStream.ToArray(), false /*writable*/); } 

写完你的线后尝试刷新streamWriter。