Язык программирования 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...");
Поделиться с друзьями: