C#. Методы класса StreamReader




Методы класса StreamReader

Данная тема есть продолжением темы:


Содержание


Поиск на других ресурсах:

1. Подключение пространства имен System.IO

Во всех нижеследующих примерах, чтобы использовать методы, нужно предварительно подключить пространства имен System и System.IO

using System;
using System.IO;

...

 

2. Методы класса StreamReader
2.1. Методы Close() и Dispose()

Согласно документации методы Close() и Dispose() имеют следующую общую форму:

public override void Close();
protected override void Dispose(bool disposing);

Метод Close() закрывает объект типа StreamReader и базовый поток а также освобождает любые системные ресурсы, ассоциированные с этим объектом.

Метод Dispose() закрывает базовый поток, освобождает неуправляемые (unmanaged) ресурсы и позволяет по выбору освобождать управляемые (managed) ресурсы с помощью параметра disposing. Если disposing = true, то освобождаются и управляемые и неуправляемые ресурсы. Если disposing = false, то освобождаются только неуправляемые ресурсы.

Вызвать метод Dispose() с параметром не удастся, поскольку он объявлен как protected. В классе TextReader есть вариант метода Dispose() без параметров, который наследуется классом StreamReader. Этот метод имеет объявления

void TextReader.Dispose();

и может быть вызван из экземпляра типа StreamReader.

Использование метода Close() выглядит следующим образом

...

StreamReader fIn = new StreamReader("myfile1.txt");
fIn.Close();

...

Аналогично может быть вызван метод Dispose()

fIn.Dispose();

 

2.2. Метод Peek()

Метод Peek() используется, когда нужно заранее определить следующий символ, который будет прочитан из потока. Метод возвращает следующий символ потока но не перемещает указатель чтения из файла. Согласно документации, объявление метода имеет вид:

public override int Peek();

Метод возвращает целое число, представляющее следующий символ. Если нет символов в потоке или поток не поддерживает поиск, то метод возвращает -1.

Пример. В примере используется метод Peek() для проверки того, достигнут конец файла. На экран выводится содержимое файла myfile1.txt.

...

// Объявить экземпляр класса StreamReader
using (StreamReader fIn = new StreamReader("myfile1.txt"))
{
  // Метод Peek() - определить, конец ли файла
  while (fIn.Peek() != -1)
  {
    string s = fIn.ReadLine(); // прочитать строку
    Console.WriteLine(s); // вывести строку на экран
  }

  fIn.Close();
}

...

 

2.3. Метод Read(). Чтение одиночного символа

Для чтения символа из потока ввода используется метод Read(), который имеет следующее объявление

public override int Read();

Метод считывает следующий символ из потока ввода и сдвигает указатель чтения из файла на один символ. Метод возвращает прочитанный символ, представленный как тип System.Int32 или -1, если символ не удалось прочитать.
Если файла не существует, генерируется исключение типа System.IOException.

Пример. В примере, с помощью метода Read() происходит посимвольно чтение файла и вывод его содержимого на экран.

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      // Прочитать содержимое файла myfile1.txt и вывести его на экран
      try
      {
        StreamReader fIn = new StreamReader("myfile1.txt");
        int c;

        while ((c = fIn.Read()) != -1)
        {
          Console.Write((char)c); // Вывести символ на экран
        }

        fIn.Close();
      }
      catch (IOException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

2.4. Метод Read(char[], int, int). Чтение группы символов в буфер

Другая перегруженная реализация метода Read() предназначена для чтения набора символов в указанный буфер и имеет следующее объявление

public override int Read(char[] buffer, int index, int count);

здесь

  • buffer — массив символов, в который считывается содержимое текущего потока ввода. Символы потока записываются в позициях от index до index + count-1 массива buffer;
  • index — позиция в буфере, с которой начинается считывание;
  • count — максимальное количество считываемых символов.

Метод возвращает количество реально прочитанных символов. Значение прочитанных символов колеблется в пределах от 0 до count. Если не удалось прочитать символы, метод возвращает 0.

При использовании метода обрабатываются следующие исключения:

  • System.ArgumentException — случай, когда длина buffer минус index является меньше чем count;
  • System.ArgumentNullExceptionbuffer равен null;
  • System.ArgumentOutOfRangeException — значение index или count отрицательны;
  • System.IO.IOException — случай, когда поток закрыт.

Пример. В примере считывается файл порциями по 10 символов с помощью метода Read().

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void TestMethod()
    {
      // Объявить экземпляр класса StreamWriter
      using (StreamWriter fOut = new StreamWriter("myfile1.txt"))
      {
        // Записать массив чисел в файл как строку
        int[] A = { 22, 331, 32, 17, 19 };

        for (int i = 0; i < A.Length; i++)
        {
          // Записать элемент массива A в файл
          fOut.Write("{0} ", A[i]);
        }

        // Дописать еще 2 числа в отдельных строках
        fOut.WriteLine();
        fOut.WriteLine(229);
        fOut.WriteLine(77);

        fOut.Close();
      }

      // Объявить экземпляр класса StreamReader
      using (StreamReader fIn = new StreamReader("myfile1.txt"))
      {
        // Метод Peek() - определить, конец ли файла
        while (fIn.Peek() != -1)
        {
          string s = fIn.ReadLine(); // прочитать строку
          Console.WriteLine(s); // вывести строку на экран
        }

        fIn.Close();
      }
    }

    static void Main(string[] args)
    {
      // Прочитать содержимое файла myfile1.txt и вывести его на экран
      try
      {
        // Создать экземпляр типа StreamReader
        StreamReader fIn = new StreamReader("myfile1.txt");

        // Создать фрагмент, куда будут записываться данные
        char[] buffer = new char[10];
        int n; // Количество прочитанных символов из файла

        do
        {
          // Прочитать 10 символов из файла fIn в буфер buffer
          n = fIn.Read(buffer, 0, 10);

          // Вывести buffer на экран
          for (int i = 0; i < n; i++)
            Console.Write(buffer[i]);
        }
        while (n != 0); // проверка, не конец ли файла

        fIn.Close();
      }
      catch (Exception e) // перехватить все исключения
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

2.5. Метод ReadBlock(). Прочитать набор символов из файлового потока

Метод ReadBlock() считывает набор символов из потока ввода в указанный участок памяти. Метод имеет следующее объявление

public override int ReadBlock(char[] buffer, int index, int count);

здесь

  • buffer – массив, в который считываются символы из потока. В массиве символы записываются начиная с позиции index до позиции (index + count — 1);
  • index — начальная позиция в массиве, в которую считываются символы из потока;
  • count — максимальное количество считываемых символов.

При использовании метода могут быть сгенерированы исключения следующих типов:

  • System.ArgumentException — случай, когда длина buffer минус index является меньше чем count;
  • System.ArgumentNullExceptionbuffer равен null;
  • System.ArgumentOutOfRangeException — значение index или count есть отрицательными;
  • System.IO.IOException — случай, когда поток закрыт;
  • System.ObjectDisposedException — случай, когда поток StreamReader закрыт.

Пример. В примере считывается содержимое файла в буфер buffer за один раз. Для определения длины файла используется класс FileInfo.

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      // Прочитать содержимое файла myfile1.txt и вывести его на экран
      try
      {
        // Создать экземпляр типа StreamReader
        StreamReader fIn = new StreamReader("myfile1.txt");

        // Определить длину файла
        FileInfo fInfo = new FileInfo("myfile1.txt");
        long len = fInfo.Length;

        // буфер для данных, размер буфера равен длине файла
        char[] buffer = new char[len];

        // Считать данные из файла за один раз
        fIn.ReadBlock(buffer, 0, buffer.Length);

        // Вывести содержимое файла на экран
        Console.Write(buffer);

        fIn.Close();
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

2.6. Метод ReadLine(). Чтение строки

Метод ReadLine() используется для чтения строки из файлового потока. Согласно документации, метод имеет следующее объявление

public override string ReadLine();

Метод возвращает строку символов из текущего файлового потока. Если достигнут конец потока, метод возвращает null.

При использовании метода могут возникать исключения следующих типов:

  • System.OutOfMemoryException — случай, когда недостаточно памяти для выделения ее в возвращаемую строку;
  • System.IO.IOException — ошибка ввода/вывода.

Пример. В примере построчно считывается текстовый файл и выводится на экран.

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      // Прочитать содержимое файла myfile1.txt и вывести его на экран
      try
      {
        // Создать экземпляр типа StreamReader
        StreamReader fIn = new StreamReader("myfile1.txt");

        // Построчное чтение файла
        string s;

        do
        {
          // Прочитать строку из файла
          s = fIn.ReadLine();

          // Вывести строку на экран
          Console.WriteLine(s);
        }
        while (s != null); // проверка, не конец ли файла

        fIn.Close();
      }
      catch (OutOfMemoryException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (System.IO.IOException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

2.7. Метод ReadToEnd()

Метод ReadToEnd() считывает все символы с текущей позиции чтения до конца потока. Объявления метода имеет вид

public override string ReadToEnd();

Метод возвращает поток в виде строки. Если текущая позиция указывает на конец потока, метод возвращает пустую строку «».

При использовании метода могут возникать исключения следующих типов:

  • System.OutOfMemoryException — случай, когда недостаточно памяти для выделения ее под выделяемую строку;
  • System.IO.IOException — ошибка ввода/вывода.

Пример. В примере выводится содержимое текстового файла на экран. Файл считывается в строку методом ReadToEnd().

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        // Создать экземпляр типа StreamReader
        StreamReader fIn = new StreamReader("myfile1.txt");

        string buffer;

        // Прочитать весь файл как строку
        buffer = fIn.ReadToEnd();

        // Вывести строку на экран
        Console.Write(buffer);

        fIn.Close();
      }
      catch (OutOfMemoryException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (System.IO.IOException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

3. Свойства класса StreamReader
3.1. Свойство BaseStream. Получить ссылку на базовый поток

С помощью свойства BaseStream можно получить ссылку на базовый поток Stream. Объявление свойства следующее

public virtual System.IO.Stream BaseStream { get; }

Пример. В примере определяется размер файла в байтах с помощью ссылки на базовый поток.

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      // Создать экземпляр типа StreamReader
      StreamReader fIn = new StreamReader("myfile1.txt");

      // Получить ссылку на базовый поток
      Stream stream = fIn.BaseStream;

      // По ссылке получить размер файла
      long len = stream.Length;

      // Вывести результат
      Console.WriteLine("The size of file = {0}", len);

      // Закрыть поток
      fIn.Close();
    }
  }
}

 

3.2. Свойство CurrentEncoding. Получить кодировку потока

Свойство CurrentEncoding позволяет получить объект, содержащий данные о текущей кодировке в потоке. Объявление свойства следующее:

public virtual System.Text.Encoding CurrentEncoding { get; }

Чтобы использовать свойство можно написать примерно следующий код

...

// Создать экземпляр типа StreamReader
StreamReader fIn = new StreamReader("myfile1.txt");

// Получить текущую кодировку
System.Text.Encoding encoding = fIn.CurrentEncoding;

// ...

fIn.Close();

...

 

3.3. Свойство EndOfStream. Определить окончание потока

Свойство EndOfStream предназначено для определения того, указывает ли текущая позиция потока на конец потока. Объявление свойства имеет вид

public bool EndOfStream { get; }

Свойство возвращает true, если текущая позиция потока указывает на его конец. В противном случае свойство возвращает false.

При использовании свойства может возникнуть исключение типа System.ObjectDisposedException.

Пример. В примере осуществляется посимвольно чтение из файла до тех пор, пока не будет достигнут конец файла. Конец файла определяется с помощью свойства EndOfStream.

using System;

// Подключить пространство имен System.IO
using System.IO;

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        // Создать экземпляр типа StreamReader
        StreamReader fIn = new StreamReader("myfile1.txt");

        Stream stream = fIn.BaseStream;

        System.Text.Encoding encoding = fIn.CurrentEncoding;

        char c;

        // Цикл посимвольного чтения файла
        while (!fIn.EndOfStream) // проверка факта окончания файла
        {
          c = (char)fIn.Read();
          Console.Write(c);
        }

        fIn.Close();
      }
      catch (ObjectDisposedException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 


Связанные темы