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()は常に1回読み取ります)。私が間違っていることがわからない。ありがとうございました。

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ものも閉じます。

本当にここに a を返し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

「using」または streamWriter.Flush() を使用していないため、ライターはストリームへの変更をコミットしませんでした。その結果、ストリーム自体にはまだデータがありません。一般に、操作を使用して 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 に答える