Запись в MemoryStream с StreamWriter возвращает пустое значение - PullRequest
24 голосов
/ 13 апреля 2011

Я не уверен, что я делаю неправильно, видел много примеров, но не могу заставить это работать.

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 ]

57 голосов
/ 13 апреля 2011

Вы забыли сбросить свой экземпляр 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);
    }
}
12 голосов
/ 13 апреля 2011

Поскольку вы не используете «using» или streamWriter.Flush (), средство записи не зафиксировало изменения в потоке. В результате Stream itlef еще не имеет данных. В общем, вы хотите обернуть манипуляции с экземплярами Stream и StremaWriter с помощью.

Вам также следует рассмотреть возможность возврата нового экземпляра MemoryStream:

using(var memStream = new MemoryStream())
{
   ....
   return new MemoryStream(memStream.ToArray(), false /*writable*/);
}
4 голосов
/ 13 апреля 2011

Попробуйте сбросить streamWriter после написания ваших строк.

...