2 // System.IO.BufferedStream
5 // Matt Kimball (matt@kimball.net)
9 public sealed class BufferedStream : Stream {
13 int m_buffer_read_ahead;
14 bool m_buffer_reading;
16 public BufferedStream(Stream stream) : this(stream, 4096) {
19 public BufferedStream(Stream stream, int buffer_size) {
21 m_buffer = new byte[buffer_size];
24 public override bool CanRead {
26 return m_stream.CanRead;
30 public override bool CanWrite {
32 return m_stream.CanWrite;
36 public override bool CanSeek {
38 return m_stream.CanSeek;
42 public override long Length {
44 return m_stream.Length;
48 public override long Position {
50 return m_stream.Position - m_buffer_read_ahead + m_buffer_pos;
55 m_stream.Position = value;
59 public override void Close() {
66 public override void Flush() {
67 if (m_buffer_reading) {
68 m_stream.Position = Position;
70 m_stream.Write(m_buffer, 0, m_buffer_pos);
73 m_buffer_read_ahead = 0;
77 public override long Seek(long offset, SeekOrigin origin) {
79 return m_stream.Seek(offset, origin);
82 public override void SetLength(long value) {
83 m_stream.SetLength(value);
86 public override int ReadByte() {
87 byte[] b = new byte[1];
89 if (Read(b, 0, 1) == 1) {
96 public override void WriteByte(byte value) {
97 byte[] b = new byte[1];
103 public override int Read(byte[] array, int offset, int count) {
104 if (!m_buffer_reading) {
106 m_buffer_reading = true;
109 if (count <= m_buffer_read_ahead - m_buffer_pos) {
110 Array.Copy(m_buffer, m_buffer_pos, array, offset, count);
112 m_buffer_pos += count;
113 if (m_buffer_pos == m_buffer_read_ahead) {
115 m_buffer_read_ahead = 0;
121 int ret = m_buffer_read_ahead - m_buffer_pos;
122 Array.Copy(m_buffer, m_buffer_pos, array, offset, ret);
124 m_buffer_read_ahead = 0;
128 if (count >= m_buffer.Length) {
129 ret += m_stream.Read(array, offset, count);
131 m_buffer_read_ahead = m_stream.Read(m_buffer, 0, m_buffer.Length);
133 if (count < m_buffer_read_ahead) {
134 Array.Copy(m_buffer, 0, array, offset, count);
135 m_buffer_pos = count;
138 Array.Copy(m_buffer, 0, array, offset, m_buffer_read_ahead);
139 ret += m_buffer_read_ahead;
140 m_buffer_read_ahead = 0;
147 public override void Write(byte[] array, int offset, int count) {
148 if (m_buffer_reading) {
150 m_buffer_reading = false;
153 if (m_buffer_pos + count >= m_buffer.Length) {
155 m_stream.Write(array, offset, count);
157 Array.Copy(array, offset, m_buffer, m_buffer_pos, count);
158 m_buffer_pos += count;