- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Бинарный ввод и вывод при помощи класса FileStream
FileStream используется для чтения и записи отдельных байтов или блоков байтов. Поскольку символы — ничто иное, как байты, FileStream можно использовать и для потоков символов. Однако он не имеет таких удобных методов для работы с символьными потоками, как StreamReader и StreamWriter.
Класс FileStream можно использовать для создания новых файлов или для работы с уже существующими.
Некоторые члены класса FileStream:
Член класса FileStream |
Описание |
Close |
Закрывает выходной поток и освобождает ассоциированные с ним ресурсы. |
ReadByte |
Читает один байт из входного потока. |
WriteByte |
Пишет один байт в выходной поток. |
Length |
Возвращает длину потока (в байтах). |
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
class TestBytesInOut
{
//Метод создает файл и записывает в него числа от 0 до 10
public static void WriteBytes()
{
FileStream outStream = null;
try
{
//
FileInfo bytesFile = new FileInfo (@"C:\MyTestFiles\numbers1.dat");
outStream = bytesFile.OpenWrite();
for (byte i = 0; i < 10; i++)
{
outStream.WriteByte(i);
}
}
catch (IOException exObj)
{
Console.WriteLine(exObj);
}
finally
{
outStream.Close();
}
}
//Метод читает числа из файла
public static void ReadBytes()
{
int totalSum = 0;
int temp = 0;
FileStream inStream = null;
try
{
FileInfo numberFile = new FileInfo (@"C:\MyTestFiles\numbers1.dat");
inStream = numberFile.OpenRead();
Console.WriteLine("Length: " + inStream.Length);
Console.WriteLine("Содержание файла");
for (int i = 0; i < inStream.Length; i++)
{
temp = inStream.ReadByte();
Console.WriteLine(temp);
totalSum += temp;
}
Console.WriteLine("\nTotal sum of numbers in file: {0}", totalSum);
}
catch (IOException exObj)
{
Console.WriteLine(exObj);
}
finally
{
inStream.Close();
}
}
}
class Tester
{
public static void Main()
{
TestBytesInOut.WriteBytes();
TestBytesInOut.ReadBytes();
Console.ReadLine();
}
}
Метод WriteBytes показывает, каким образом класс FileStream можно использовать для создания нового файла, а затем для записи в него десяти чисел типа byte. Метод ReadBytes применяет FileStream для последующего их чтения из этого файла.
Для создания нового объекта FileStream можно использовать собственный конструктор FileStream, или методы Filelnfo. Второй путь применен в листинге 22.3, где OpenWrite (строка 13) и OpenRead (строка 41) используются для получения бинарных потоков типа FileStream.
Для записи данных, объектом outStream типа FileStream создается новый файл C:\MyTestFiles\numbersl.dat. Метод WriteByte принимает один аргумент типа byte и записывает его туда. В нашем случае в записываются первые десять чисел (начиная с нуля).
Следует отметить, что файл C:\MyTestFiles\numbersl.dat — не текстовый, а бинарный, текстовым редактором просмотреть его нельзя. Для просмотра можно использовать поток типа FileStream, возвращенный методом OpenRead.
Свойство Length позволяет определить, сколько раз должен выполниться цикл for. Это имеет смысл, поскольку:
-
Length возвращает число байт в inStream
-
цикл будет повторятся Length раз
-
при каждой итерации цикла считывается один байт, начиная с первого.
Таким образом, каждый байт из numbersl.dat присваивается переменной temp и выводится затем на консоль.
Данные из numbersl.dat можно использовать в вычислениях. В нашем случае, на каждом шаге temp прибавляется к totalSum (что и определяет сумму всех чисел из файла numbersl.dat). Результат выводится на консоль.
■ ■