使用StreamWriter写入MemoryStream将返回空

时间:2011-04-13 17:12:48

标签: 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;
}

我正在对此方法进行一个简单的测试,试图让它通过,但无论如何,我的收集计数为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()总是读取一次)。不确定我做错了什么。谢谢。

3 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:4)

在写完行后尝试刷新streamWriter。