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.ArgumentNullException – buffer рівний 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.ArgumentNullException – buffer рівний 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);
      }
    }
  }
}

 


Зв’язані теми