Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

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

FileStream.Write
. Чтобы прочитать байты обратно в память, понадобится сбросить внутреннюю позицию потока (посредством свойства
Position
) и вызвать метод
ReadByte
. Наконец, на консоль выводится содержимое низкоуровневого байтового массива и декодированная строка. Ниже приведен полный код:

using System;

using System.IO;

using System.Text;

// He забудьте импортировать пространства
имен System.Text и System.IO.

Console.WriteLine("***** Fun with FileStreams *****\n");

// Получить объект FileStream.

using(FileStream fStream = File.Open("myMessage.dat",

FileMode.Create))

{

// Закодировать строку в виде массива байтов.

string msg = "Hello!";

byte[] msgAsByteArray = Encoding.Default.GetBytes(msg);

// Записать byte[] в файл.

fStream.Write(msgAsByteArray, 0, msgAsByteArray.Length);

// Сбросить внутреннюю позицию потока.

fStream.Position = 0;

// Прочитать byte[] из файла и вывести на консоль.

Console.Write("Your message as an array of bytes: ");

byte[] bytesFromFile = new byte[msgAsByteArray.Length];

for (int i = 0; i < msgAsByteArray.Length; i++)

{

bytesFromFile[i] = (byte)fStream.ReadByte;

Console.Write(bytesFromFile[i]);

}

// Вывести декодированное сообщение.

Console.Write("\nDecoded Message: ");

Console.WriteLine(Encoding.Default.GetString(bytesFromFile));

Console.ReadLine;

}

File.Delete("myMessage.dat");

В приведенном примере не только производится наполнение файла данными, но также демонстрируется основной недостаток прямой работы с типом

FileStream
: необходимость оперирования низкоуровневыми байтами. Другие производные от
Stream
типы работают в похожей манере. Например, чтобы записать последовательность байтов в область памяти, понадобится создать объект
MemoryStream
.

Как упоминалось ранее, в пространстве имен

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

Работа с типами StreamWriter и StreamReader

Классы

StreamWriter
и
StreamReader
удобны всякий раз, когда нужно читать или записывать символьные данные (например, строки). Оба типа по умолчанию работают с символами Unicode; тем не менее, это можно изменить за счет предоставления должным образом сконфигурированной ссылки на объект
System.Text.Encoding
. Чтобы не усложнять пример, предположим, что стандартная кодировка Unicode вполне устраивает.

Класс

StreamReader
является производным от абстрактного класса по имени
TextReader
, как и связанный с ним тип
StringReader
(обсуждается далее в главе). Базовый класс
TextReader
предоставляет каждому из своих наследников ограниченный набор функциональных средств, в частности возможность читать и "заглядывать" в символьный поток.

Класс

StreamWriter
(а также
StringWriter
, который будет рассматриваться позже) порожден от абстрактного базового класса по имени
TextWriter
, в котором определены члены, позволяющие производным типам записывать текстовые данные в текущий символьный поток.

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

StreamWriter
и
StringWriter
, в табл. 20.8 перечислены основные члены абстрактного базового класса
TextWriter
.

На заметку! Вероятно, последние два члена класса

TextWriter
покажутся знакомыми. Вспомните, что тип
System.Console
имеет члены
Write
и
WriteLine
, которые выталкивают текстовые данные на стандартное устройство вывода. В действительности свойство
Console.In
является оболочкой для объекта
TextWriter
, a
Console.Out
— для
TextWriter
.

Производный класс

StreamWriter
предоставляет подходящую реализацию методов
Write
,
Close
и
Flush
, а также определяет дополнительное свойство
AutoFlush
. Установка этого свойства в
true
заставляет
StreamWriter
выталкивать данные при каждой операции записи. Имейте в виду, что за счет установки
AutoFlush
в
false
можно достичь более высокой производительности, но по завершении работы с объектом
StreamWriter
должен быть вызван метод
Close
.

Запись в текстовый файл

Чтобы увидеть класс

StreamWriter
в действии, создайте новый проект консольного приложения по имени
StreamWriterReaderApp
и импортируйте пространства имен
System.IO
и
System.Text
. В показанном ниже коде с помощью метода
File.CreateText
создается новый файл
reminders.txt
внутри текущего каталога выполнения. С применением полученного объекта
StreamWriter
в новый файл будут добавляться текстовые данные.

using System;

using System.IO;

using System.Text;

Console.WriteLine("***** Fun with StreamWriter / StreamReader *****\n");

// Получить объект StreamWriter и записать строковые данные.

using(StreamWriter writer = File.CreateText("reminders.txt"))

{

writer.WriteLine("Don't forget Mother's Day this year...");

Поделиться с друзьями: