| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- //
- // System.IO.StreamReader.cs
- //
- // Author:
- // Dietmar Maurer ([email protected])
- //
- // (C) Ximian, Inc. http://www.ximian.com
- //
- using System;
- using System.Text;
- namespace System.IO {
-
- public class StreamReader : TextReader {
- // buffering members
- private char[] buffer;
- private int pos;
- private Encoding internalEncoding;
- private Decoder decoder;
- private Stream internalStream;
- public new static readonly StreamReader Null = new StreamReader((Stream)null);
- public StreamReader(Stream stream)
- : this (stream, null, false, 0) { }
- public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
- : this (stream, null, detectEncodingFromByteOrderMarks, 0) { }
- public StreamReader(Stream stream, Encoding encoding)
- : this (stream, encoding, false, 0) { }
- public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
- : this (stream, encoding, detectEncodingFromByteOrderMarks, 0) { }
-
- [MonoTODO]
- public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize)
- {
- internalStream = stream;
- // use detect encoding flag
- if (encoding == null) {
- internalEncoding = Encoding.UTF8;
- decoder = Encoding.UTF8.GetDecoder ();
- } else {
- internalEncoding = encoding;
- decoder = encoding.GetDecoder ();
- }
- buffer = null;
- }
- public StreamReader(string path)
- : this (path, null, false, 0) { }
- public StreamReader(string path, bool detectEncodingFromByteOrderMarks)
- : this (path, null, detectEncodingFromByteOrderMarks, 0) { }
- public StreamReader(string path, Encoding encoding)
- : this (path, encoding, false, 0) { }
- public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
- : this (path, encoding, detectEncodingFromByteOrderMarks, 0) { }
-
- [MonoTODO]
- public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize)
- {
- // use detect encoding flag
- if (encoding == null) {
- internalEncoding = Encoding.UTF8;
- decoder = Encoding.UTF8.GetDecoder ();
- } else {
- internalEncoding = encoding;
- decoder = encoding.GetDecoder ();
- }
- internalStream = (Stream) File.OpenRead (path);
- buffer = null;
- }
- public virtual Stream BaseStream
- {
- get {
- return internalStream;
- }
- }
- public Encoding CurrentEncoding
- {
- get {
- return internalEncoding;
- }
- }
- public override void Close ()
- {
- Dispose (true);
- }
- public void DiscardBufferedData ()
- {
- if ((buffer == null) || (pos == buffer.Length))
- return;
- if (!internalStream.CanSeek)
- return;
- int seek_back = pos - buffer.Length;
- internalStream.Seek (seek_back, SeekOrigin.Current);
- }
- private int GetRemaining ()
- {
- return (buffer != null) ? buffer.Length - pos : 0;
- }
- private int RoundUpTo (int number, int roundto)
- {
- if ((number % roundto) == 0)
- return number;
- else
- return ((number / roundto) + 1) * roundto;
- }
- private bool ReadBuffer (int count)
- {
- // There are still enough bytes in the buffer.
- if ((buffer != null) && (pos + count <= buffer.Length))
- return true;
- // Number of bytes remaining in the buffer.
- int remaining = GetRemaining ();
- // Round up to block size
- int size = RoundUpTo (count, 4096);
- byte[] bytes = new byte [size];
- int cnt = internalStream.Read (bytes, 0, size);
- if (cnt <= 0)
- return false;
- int bufcnt = decoder.GetCharCount (bytes, 0, cnt);
- char[] newbuffer = new char [remaining + bufcnt];
- if (remaining > 0)
- Array.Copy (buffer, pos, newbuffer, 0, remaining);
- buffer = newbuffer;
- bufcnt = decoder.GetChars (bytes, 0, cnt, buffer, remaining);
- pos = 0;
- return true;
- }
- public override int Peek ()
- {
- if (!internalStream.CanSeek)
- return -1;
- if (!ReadBuffer (1))
- return -1;
- return buffer [pos];
- }
- public override int Read ()
- {
- if (!ReadBuffer (1))
- return -1;
- return buffer[pos++];
- }
- public override int Read (char[] dest_buffer, int index, int count)
- {
- if (dest_buffer == null)
- throw new ArgumentException ();
- if (index + count >= dest_buffer.Length)
- throw new ArgumentException ();
- if ((index < 0) || (count < 0))
- throw new ArgumentOutOfRangeException ();
- if (!ReadBuffer (count))
- return -1;
- int remaining = buffer.Length - pos;
- int size = Math.Min (remaining, count);
- Array.Copy (buffer, pos, dest_buffer, index, size);
- return size;
- }
- public override string ReadLine()
- {
- StringBuilder text = new StringBuilder ();
- while (true) {
- int c = Read ();
- if (c == -1) { // end of stream
- if (text.Length == 0)
- return null;
- break;
- }
- if (c == '\n') // newline
- break;
- if (c == '\r' && Peek () == '\n') { // cr, newline
- Read ();
- break;
- }
- text.Append ((char) c);
- }
- return text.ToString ();
- }
- public override string ReadToEnd()
- {
- StringBuilder text = new StringBuilder ();
- while (true) {
- int c = Read ();
- if (c == -1) {
- if (text.Length == 0)
- return null;
- break;
- }
- text.Append ((char) c);
- }
- return text.ToString ();
- }
- }
- }
|