2012-11-21 2 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/Close이라고 부르는 경우에만 데이터가 파일에 나타나는 이유는 무엇입니까?C# BufferedSize가 제대로 작동하지 않습니까?

+0

여기서't'는 무엇입니까? –

+0

버프해야합니다. – 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 

기본 스트림의 길이가 있음 때문이다 12buff.Length하는 이유이다. 기본적으로, 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

BufferedStream8 바이트 뒤에 FileStream 내부 버퍼에 내용을 씁니다.

그러나 FileStream 자체는 자체 버퍼링을 사용하므로 콘텐츠를 자주 작성하지 않습니다.

관련 문제