Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 388
Эндрю Троелсен
Предположим, что мы создали новое консольное приложение FileStreamApp. Нашей целью является запись простого текстового сообщения в новый файл с именем myMessage.dat. Но поскольку FileStream может воздействовать только на отдельные байты, требуется перевести тип System.String в соответствующий массив байтов. К счастью, в пространстве имен System.Text определяется тип Encoding, предлагающий члены, которые выполняют кодирование и декодирование строк и массивов байтов (для подробного описания типа Encoding обратитесь к документации .NET Framework 2.0 SDK).
После выполнения кодирования массив байтов переводится в файл с помощью метода FileStream.Write(). Чтобы прочитать байты обратно в память, необходимо переустановить внутренний указатель позиции потока (с помощью свойства Position) и вызвать метод ReadByte(). Наконец, массив байтов и декодированная строка выводятся на консоль. Вот полный текст соответствующего метода Main().
// Не забудьте 'использовать' System.Text.
static void Main(string[] args) {
Console.WriteLine("***** Забавы с FileStreams *****\n");
// Получение объекта FileStream.
FileStream fStream = File.Open(@"C:\myMessage.dat", FileMode.Create);
// Кодирование строки в виде массива байтов.
string msg = "Привет!";
byte[] msgAsByteArray = Encoding.Default.GetBytes(msg);
// Запись byte[] в файл.
fStream.Write(msgAsByteArray, 0, msgAsByteArray.Length);
// Переустановка внутреннего указателя позиции потока.
fStream.Position = 0;
// Чтение типов из файла и вывод на консоль….
Console.Write("Ваше сообщение в виде массива байтов: ");
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("\nДекодированное сообщение: ");
Console.WriteLine(Encoding.Default.GetString(bytesFromFile));
// Завершение потока.
fStream.Close();
}
Хотя в этом примере файл данными не заполняется, уже здесь становится очевидным главный недостаток работы с типом FileStream: приходится воздействовать непосредственно на отдельные байты. Другие типы, являющиеся производными от Strеаm, работают аналогично. Например, чтобы записать последовательность байтов в заданную область памяти, можно использовать MemoryStream. Точно так же, чтобы передать массив байтов по сети, вы можете использовать тип NetworkStream.
К счастью, пространство имен System.IO предлагает целый ряд типов "чтения" и "записи", инкапсулирующих особенности работы с типами, производными от Stream.
Исходный код. Проект FileStreamApp размещен в подкаталоге, соответствующем главе 16.
Работа с StreamWriter и StreamReader
Классы StreamWriter и StreamReader оказываются полезны тогда, когда приходится читать или записывать символьные данные (например, строки). Оба эти типа по умолчанию работают с символами Unicode, однако вы можете изменить эти установки, предоставив ссылку на правильно сконфигурированный объект System.Text.Encoding. Чтобы упростить рассмотрение, предположим, что предлагаемое по умолчавию кодирование в символы Unicode как раз и является подходящим.