2012-11-21 127 views
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字节的bufer大小时,内容被刷新。 那么为什么buff.Length返回12,以及为什么数据只出现在文件中,如果我明确呼吁Dispose/Closec#BufferedSize无法正常工作?

+0

这里是什么? –

+0

它应该是buff,sry – asdas

回答

1

BufferedStream工作正常 - 它不刷新:stream.Length8直到它关闭;即

// 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.Length12是因为即底层流的长度。基本上,BufferedStream只是重新暴露出下面的流,并确保不会错过它增加了一个Flush()缓冲数据如果有缓冲的数据:

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也可以有自己的缓冲区

0

BufferedStream将在8字节之后将其缓冲区的内容写入内部FileStream

然而,FileStream本身有自己的缓冲区,并且会少写内容。