Методи класу StreamReader
Дана тема є продовженням теми:
Зміст
- 1. Підключення простору імен System.IO
- 2. Методи класу StreamReader
- 3. Властивості класу 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); } } } }
⇑
Зв’язані теми
- Класи StreamReader, StreamWriter. Робота з текстовими файлами. Конструктори класу StreamReader
- Клас StreamWriter. Призначення. Конструктори. Створення потоку виводу різними способами
- Клас StreamWriter. Огляд методів та властивостей
⇑