Подтвердить что ты не робот

Запись в 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() всегда читает один раз). Не уверен, что я делаю неправильно. Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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