BufferedStream.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //
  2. // System.IO.BufferedStream
  3. //
  4. // Author:
  5. // Matt Kimball ([email protected])
  6. //
  7. namespace System.IO {
  8. public sealed class BufferedStream : Stream {
  9. Stream m_stream;
  10. byte[] m_buffer;
  11. int m_buffer_pos;
  12. int m_buffer_read_ahead;
  13. bool m_buffer_reading;
  14. public BufferedStream(Stream stream) : this(stream, 4096) {
  15. }
  16. public BufferedStream(Stream stream, int buffer_size) {
  17. m_stream = stream;
  18. m_buffer = new byte[buffer_size];
  19. }
  20. public override bool CanRead {
  21. get {
  22. return m_stream.CanRead;
  23. }
  24. }
  25. public override bool CanWrite {
  26. get {
  27. return m_stream.CanWrite;
  28. }
  29. }
  30. public override bool CanSeek {
  31. get {
  32. return m_stream.CanSeek;
  33. }
  34. }
  35. public override long Length {
  36. get {
  37. return m_stream.Length;
  38. }
  39. }
  40. public override long Position {
  41. get {
  42. return m_stream.Position - m_buffer_read_ahead + m_buffer_pos;
  43. }
  44. set {
  45. Flush();
  46. m_stream.Position = value;
  47. }
  48. }
  49. public override void Close() {
  50. Flush();
  51. m_stream.Close();
  52. Dispose();
  53. }
  54. public override void Dispose() {
  55. m_stream.Dispose();
  56. m_buffer = null;
  57. }
  58. public override void Flush() {
  59. if (m_buffer_reading) {
  60. m_stream.Position = Position;
  61. } else {
  62. m_stream.Write(m_buffer, 0, m_buffer_pos);
  63. }
  64. m_buffer_read_ahead = 0;
  65. m_buffer_pos = 0;
  66. }
  67. public override long Seek(long offset, SeekOrigin origin) {
  68. Flush();
  69. return m_stream.Seek(offset, origin);
  70. }
  71. public override void SetLength(long value) {
  72. m_stream.SetLength(value);
  73. }
  74. public override int ReadByte() {
  75. byte[] b = new byte[1];
  76. if (Read(b, 0, 1) == 1) {
  77. return b[0];
  78. } else {
  79. return -1;
  80. }
  81. }
  82. public override void WriteByte(byte value) {
  83. byte[] b = new byte[1];
  84. b[0] = value;
  85. Write(b, 0, 1);
  86. }
  87. public override int Read(byte[] array, int offset, int count) {
  88. if (!m_buffer_reading) {
  89. Flush();
  90. m_buffer_reading = true;
  91. }
  92. if (count <= m_buffer_read_ahead - m_buffer_pos) {
  93. Array.Copy(m_buffer, m_buffer_pos, array, offset, count);
  94. m_buffer_pos += count;
  95. if (m_buffer_pos == m_buffer_read_ahead) {
  96. m_buffer_pos = 0;
  97. m_buffer_read_ahead = 0;
  98. }
  99. return count;
  100. }
  101. int ret = m_buffer_read_ahead - m_buffer_pos;
  102. Array.Copy(m_buffer, m_buffer_pos, array, offset, ret);
  103. m_buffer_pos = 0;
  104. m_buffer_read_ahead = 0;
  105. offset += ret;
  106. count -= ret;
  107. if (count >= m_buffer.Length) {
  108. ret += m_stream.Read(array, offset, count);
  109. } else {
  110. m_buffer_read_ahead = m_stream.Read(m_buffer, 0, m_buffer.Length);
  111. if (count < m_buffer_read_ahead) {
  112. Array.Copy(m_buffer, 0, array, offset, count);
  113. m_buffer_pos = count;
  114. ret += count;
  115. } else {
  116. Array.Copy(m_buffer, 0, array, offset, m_buffer_read_ahead);
  117. ret += m_buffer_read_ahead;
  118. m_buffer_read_ahead = 0;
  119. }
  120. }
  121. return ret;
  122. }
  123. public override void Write(byte[] array, int offset, int count) {
  124. if (m_buffer_reading) {
  125. Flush();
  126. m_buffer_reading = false;
  127. }
  128. if (m_buffer_pos + count >= m_buffer.Length) {
  129. Flush();
  130. m_stream.Write(array, offset, count);
  131. } else {
  132. Array.Copy(array, offset, m_buffer, m_buffer_pos, count);
  133. m_buffer_pos += count;
  134. }
  135. }
  136. }
  137. }