C#. Класи StreamReader та StreamWriter. Робота з текстовими файлами




Класи StreamReader та StreamWriter. Робота з текстовими файлами. Конструктори класу StreamReader


Зміст


Пошук на інших ресурсах:

1. Класи StreamReader, StreamWriter. Призначення

Класи StreamReader та StreamWriter використовуються для роботи з потоками символьних даних. Найбільше застосування класів – робота з текстовими файлами.

Клас StreamReader використовується для читання з потоку символьних даних. Клас StreamReader є похідним від абстрактного класу TextReader (рисунок 1), який оголошує базові методи для зчитування символів з байтового потоку у заданій системі кодування. В свою чергу, клас StreamReader реалізує методи класу TextReader і є основним класом, який застосовується для читання інформації з текстових файлів.

C#. Класи TextReader та StreamReader

Рисунок 1. Класи TextReader та StreamReader

Клас StreamWriter використовується для запису в потік символів у заданому кодуванні. Клас є похідним від абстрактного класу TextWriter (рисунок 2) і реалізує його методи. Клас StreamWriter є основним класом, який використовується для запису символьних даних у файл.

C#. Класи TextWriter та StreamWriter

Рисунок 2. Класи TextWriter та StreamWriter

Для того, щоб використовувати класи StreamReader та StreamWriter, у програмі потрібно підключити простір імен System.IO

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

 

2. Огляд методів та властивостей класу StreamReader

Нижче наведено перелік основних методів, які успадковані від класу TextReader і реалізовані у класі StreamReader:

  • Close() – закриває об’єкт типу StreamReader та базовий потік і звільнює всі системні ресурси, зв’язані з цим об’єктом;
  • Dispose() – закриває базовий потік та дає можливість задати звільнення керованих ресурсів;
  • Peek() – повертає наступний доступний символ без зміщення позиції покажчика читання з файлу;
  • Read() – читає один або декілька символів (в залежності від реалізації) зі зміщенням покажчика читання з файлу;
  • ReadAsync() – читає асинхронно задану кількість символів з потоку і записує дані в буфер;
  • ReadBlock() – читає масив символів у заданий буфер;
  • ReadBlockAsync() – читає масив символів з поточного потоку асинхронно;
  • ReadLine() – читає рядок символів з потоку до символа нового рядка;
  • ReadLineAsync() – читає асинхронно рядок символів;
  • ReadToEnd() – зчитує всі символи з потоку, починаючи з поточної позиції до кінця потоку;
  • ReadToEnd() – зчитує асинхронно всі символи з потоку, починаючи з поточної позиції покажчика читання до кінця потоку.

У класі StreamReader є 3 властивості, які не успадковані від класу TextReader:

  • BaseStream – повертає основний потік;
  • CurrentEncoding – повертає поточне кодування потоку;
  • EndOfStream – визначає, чи не досягнуто кінця потоку.

 

3. Конструктори класу StreamReader. Створення потоку, зв’язаного з текстовим файлом

Клас StreamReader має ряд перевантажених конструкторів, які дозволяють отримувати доступ до потоку вводу з застосуванням різних додаткових опцій.
В загальному, один з можливих варіантів створення та використання потоку вводу виглядає приблизно так

try
{
  // Створити потік вводу шляхом виклику конструктора
  StreamReader fIn = StreamReader(...);

  // Використати потік вводу
  ...

  // Закрити потік вводу
  fIn.Close();
}
catch (ExceptionType1 e)
{
  // Обробити виключення ExceptionType1
  ...
}
catch (ExceptionType1 e)
{
  // Обробити виключення ExceptionType2
  ...
}
...
catch (ExceptionTypeN e)
{
  // Обробити виключення ExceptionTypeN
  ...
}

У вищенаведеному фрагменті ExceptionType1, ExceptionType2, …, ExceptionTypeN – типи виключень, що можуть виникати при використанні одного з конструкторів класу StreamReader.

 

3.1. Конструктор StreamReader(string)

Даний конструктор ініціалізує новий екземпляр класу StreamReader для визначеного імені файлу. Загальна форма конструктора

public StreamReader(string path);

тут

  • path – шлях до файлу.

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

  • System.ArgumentException – шлях path є пустим рядком “”;
  • System.ArgumentNullException – шлях path рівний null;
  • System.IO.FileNotFoundException – файл не знайдено;
  • System.IO.DirectoryNotFoundException – шлях задано неправильно;
  • System.IO.IOException – шлях включає некоректний або помилковий синтаксис для імені файлу, імені директорію або мітки тома.

Приклад.

using System;

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

namespace ConsoleApp12
{
  class Program
  {
    static void Main(string[] args)
    {
      // Створити екземпляр потоку
      // з допомогою конструктора StreamReader(string)
      try
      {
        StreamReader fInput = new StreamReader("myfile1.txt");

        // Використати потік
        // ...

        // Закрити потік
        fInput.Close();
      }
      catch (ArgumentException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (FileNotFoundException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (DirectoryNotFoundException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (IOException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

Ланцюг блоків catch() можна об’єднати в один блок, який обробляє тип виключення Exception за наступним зразком

...

// Створити екземпляр потоку
// з допомогою конструктора StreamReader(string)
try
{
  StreamReader fInput = new StreamReader("myfile1.txt");

  // Використати потік
  // ...

  // Закрити потік
  fInput.Close();
}
catch (System.Exception e)
{
  Console.WriteLine(e.Message);
}

...

 

3.2. Конструктор StreamReader(string, System.Text.Encoding)

При читанні потоку вводу існує можливість вказати систему кодування символів. Для цього використовується конструктор

public StreamReader(string path, System.Text.Encoding encoding);

Можливі виключення наступних типів:

  • System.ArgumentException – шлях path є пустим рядком “”;
  • System.ArgumentNullException – шлях path рівний null;
  • System.IO.FileNotFoundException – файл не знайдено;
  • System.IO.DirectoryNotFoundException – шлях задано неправильно;
  • System.NotSupportedException – шлях path включає некоректний або помилковий синтаксис в імені файлу, імені директорію або мітці тому.

Приклад.

using System;

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

...

// Створити екземпляр потоку
try
{
  // Створити ASCII-кодування символів
  System.Text.Encoding encoding = System.Text.Encoding.ASCII;

  // Відкрити потік вводу в заданому кодуванні
  StreamReader fInput = new StreamReader("myfile1.txt", encoding);

  // Використати потік
  // ...

  // Закрити потік
  fInput.Close();
}
catch (System.Exception e)
{
  Console.WriteLine(e.Message);
}

...

 

3.3. Конструктор StreamReader(System.IO.Stream)

З допомогою даного конструктора існує можливість створити потік вводу з іншого потоку, успадкованого від базового класу Stream (наприклад, з потоку FileStream). Загальна форма такого конструктора наступна

public StreamReader(System.IO.Stream stream);

тут stream – визначений потік, зв’язаний з файлом.

При використанні конструктора можливі наступні виключні ситуації:

  • System.ArgumentException – потік не підтримує читання;
  • System.ArgumentNullException – потік або кодування рівний null.

Приклад.

using System;
using System.IO;

...

// Використати оператор using()
// 1. Створити екземпляр потоку FileStream
using (FileStream inputStream = new FileStream("myfile1.txt", FileMode.Open))
{
  // 2. Створити екземпляр потоку StreamReader()
  // з допомогою конструктора StreamReader(Stream)
  using (StreamReader fInput = new StreamReader(inputStream))
  {
    // Використати потік fInput
    // ...
  }
}

...

 

3.4. Конструктор StreamReader(System.IO.Stream, System.Text.Encoding)

Даний конструктор створює потік вводу з іншого потоку вводу на основі заданого кодування символів. Згідно з документацією оголошення конструктора наступне

public StreamReader(System.IO.Stream stream, System.Text.Encoding encoding)

тут

  • stream – потік, що має бути прочитаним;
  • encoding – система кодування (Unicode, UTF-8, UTF 7 тощо).

При використанні конструктора можуть виникнути виключні ситуації наступних типів:

  • System.ArgumentException – шлях path є пустим рядком “”;
  • System.ArgumentNullException – шлях path рівний null.

Приклад.

using System;

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

...

try
{
  // 1. Створити екземпляр потоку FileStream
  FileStream inputStream = new FileStream("myfile1.txt", FileMode.Open);

  // 2. Створити екземпляр потоку StreamReader()
  // з допомогою конструктора StreamReader(Stream, System.Text.Encoding)
  // в системі кодування UTF-8
  StreamReader fInput = new StreamReader(inputStream, System.Text.Encoding.UTF8);

  // Використати потік
  // ...

  // Закрити потік
  fInput.Close();
}
catch (System.Exception e)
{
  Console.WriteLine(e.Message);
}

...

 

4. Застосування оператора using() при створенні потоку вводу

Створення потоку вводу типу StreamReader здійснюється з використанням одного з доступних конструкторів. Кожен конструктор має свої особливості та містить різну кількість параметрів. Після роботи з потоком вводу цей потік потрібно закрити методом Close().

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

...

StreamReader fIn = StreamReader(...);

// Обробка потоку fIn
...

// Закрити потік fIn
fIn.Close();

...

Існує інший спосіб створення потоку вводу та звільнення ресурсів, пов’язаних з ним. Для цього використовується оператор using() яке гарантує автоматичне очищення ресурсів

using (StreamReader fIn=StreamReader(...))
{
  // Обробка потоку fIn
  ...
}

Приклад. У прикладі з допомогою оператора using() створюється потік типу FileStream з файлу myfile1.txt. Викликається конструктор класу FileStream. Потім з допомогою вкладеного оператора using() створюється потік вводу типу StreamReader. Після використання, потоки не потрібно закривати методом Close(), оскільки ресурси, зв’язані з цими потоками будуть звільнені (закриті) автоматично.

...

// Створити екземпляр потоку FileStream
using (FileStream fs = new FileStream("myfile1.txt", FileMode.Open))
{
  // Створити екземпляр потоку StreamReader
  using (StreamReader fIn = new StreamReader(fs))
  {
    // Використання потоку StreamReader
    // ...
  }
}

...

 


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