微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用StreamWriter写入MemoryStream返回空

如何解决用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>();
        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
。 您确定要在这里退还6英镑吗? 我将代码更改为此:
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);
    }
}
    ,由于您未使用\“ using \”或streamWriter.Flush(),因此编写器未提交对流的更改。结果,Stream itslef还没有数据。通常,您想使用using将操作与Stream和StremaWriter实例包装在一起。 您还应该考虑返回MemoryStream的新实例:
using(var memStream = new MemoryStream())
{
   ....
   return new MemoryStream(memStream.ToArray(),false /*writable*/);
}
    ,编写行后,尝试刷新streamWriter。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。