1
FileStream stream = new FileStream("test",FileMode.Create);
BufferedStream buff = new BufferedStream(stream, 8);
BinaryWriter writer = new BinaryWriter(buff);
writer.Write(1);
writer.Write(2);
writer.Write(3);
Console.WriteLine(buff.Length);

私が理解しているように、コンテンツはこのコードで8バイトのバッファサイズに達するとフラッシュされます。では、なぜbuff.Length12を返し、明示的に呼び出した場合にのみデータがファイルに表示されるのDispose/Closeでしょうか。

4

2 に答える 2

1

正常にBufferedStream動作します-フラッシュされません:閉じstream.Lengthられる8までです。すなわち

// note these should really use "using" statements of similar
FileStream stream = new FileStream("test", FileMode.Create);
BufferedStream buff = new BufferedStream(stream, 8);
BinaryWriter writer = new BinaryWriter(buff);
writer.Write(1);
writer.Write(2);
writer.Write(3);
Console.WriteLine(stream.Length); // 8
Console.WriteLine(buff.Length); // 12

その理由buff.Lengthは、それが基になるストリームの長さ12だからです。基本的には、下のストリームを再公開し、バッファリングされたデータを見逃さないようにするために、バッファリングされたデータがある場合は追加します。BufferedStreamFlush()

public override long Length
{
    get
    {
        this.EnsureNotClosed();
        if (this._writePos > 0)
        {
            this.FlushWrite();
        }
        return this._stream.Length;
    }
}

したがって:

Console.WriteLine(stream.Length); // 8
Console.WriteLine(buff.Length); // 12
Console.WriteLine(stream.Length); // 12

FileStreamは独自のバッファリングも持つことができることに注意してください

于 2012-11-21T13:22:48.440 に答える
0

BufferedStream、バッファの内容をバイトのFileStream後に内部に書き込みます。8

ただし、FileStreamそれ自体には独自のバッファリングがあり、コンテンツの書き込み頻度は低くなります。

于 2012-11-21T13:18:51.070 に答える