42

我不确定我做错了什么,看过很多例子,但似乎无法让它发挥作用。

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>();
        string input;

        while ((input = reader.ReadLine()) != null)
            collection.Add(input);

        Assert.AreEqual(6, collection.Count);
    }
}

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

4

3 回答 3

92

您忘记刷新您的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>();
        string input;

        while ((input = reader.ReadLine()) != null)
            collection.Add(input);

        Assert.AreEqual(6, collection.Count);
    }
}
于 2011-04-13T17:18:00.913 回答
15

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

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

using(var memStream = new MemoryStream())
{
   ....
   return new MemoryStream(memStream.ToArray(), false /*writable*/);
}
于 2011-04-13T17:22:50.040 回答
8

写完行后尝试刷新 streamWriter。

于 2011-04-13T17:20:08.947 回答