Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Работа с FileStream
Работа с FileStream
Класс FileStream обеспечивает реализацию абстрактных членов Stream в виде, подходящем для файловых потоков. Это довольно примитивный поток – он может читать или записывать только один байт или массив байтов. На самом деле необходимость непосредственного взаимодействия с членами типа FileStream возникает очень редко. Вы чаще будете использовать различные упаковщики потоков, которые упрощают работу с текстовыми данными или типами .NET. Однако для примера давайте поэкспериментируем со средствами синхронного чтения/записи типа FileStream.
Предположим, что мы создали новое консольное приложение 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.
- Абстрактный класс Stream
- Класс StreamWriter
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Лекция 15. Работа с базами данных
- Работа с ресурсами локальной сети
- Эффективная работа с временными файлами сортировки
- Ускоренная работа с индексами
- HR-брендинг: Работа с поколением Y, новые инструменты для коммуникации, развитие корпоративной культуры и еще 9 эффектив...
- Безопасная работа с внешними таблицами
- Работа со строками
- 9.2. Работа прокси-сервера
- 3. Заработок для фотографов: заработать на фото – сайты фотобанков