Класи StreamReader та StreamWriter. Робота з текстовими файлами. Конструктори класу StreamReader
Зміст
- 1. Класи StreamReader, StreamWriter. Призначення
- 2. Огляд методів та властивостей класу StreamReader
- 3. Конструктори класу StreamReader. Створення потоку, зв’язаного з текстовим файлом
- 4. Застосування оператора using() при створенні потоку вводу
- Зв’язані теми
Пошук на інших ресурсах:
1. Класи StreamReader, StreamWriter. Призначення
Класи StreamReader та StreamWriter використовуються для роботи з потоками символьних даних. Найбільше застосування класів – робота з текстовими файлами.
Клас StreamReader використовується для читання з потоку символьних даних. Клас StreamReader є похідним від абстрактного класу TextReader (рисунок 1), який оголошує базові методи для зчитування символів з байтового потоку у заданій системі кодування. В свою чергу, клас StreamReader реалізує методи класу TextReader і є основним класом, який застосовується для читання інформації з текстових файлів.
Рисунок 1. Класи TextReader та StreamReader
Клас StreamWriter використовується для запису в потік символів у заданому кодуванні. Клас є похідним від абстрактного класу TextWriter (рисунок 2) і реалізує його методи. Клас 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 // ... } } ...
⇑
Зв’язані теми
- Методи класу StreamReader
- Клас StreamWriter. Призначення. Конструктори. Створення потоку виводу різними способами
- Клас StreamWriter. Огляд методів та властивостей
⇑