Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по C_1.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.11 Mб
Скачать

1.5. Классы символьных потоков:

Классы потока

Описание

StreamReader , StreamWriter

Чтение из файла и запись в файл тестовой информации (последовательный доступ).

StringReader,

StringWriter

Работа с текстовой информацией в оперативной памяти. Соответствующим хранилищем является строковый буфер, а не физический файл.

Символьные потоки StreamReader и StreamWriter работают с Unicode-символами, поэтому ими удобнее пользоваться для работы с текстовыми файлами, предназначенными для восприятия человеком. Эти потоки являются наследниками базовых абстрактных классов TextWriter и TextReader.

1.6. Классы двоичных потоков:

Классы потока

Описание

BinaryReader,

BinaryWritter

Чтение и запись в файл простых встроенных типов (числовых, логических, символьных и т.п.) во внутренней (двоичной) форме представления

Двоичные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть во внутреннем представлении. Двоичные файлы не применяются для просмотра человеком, они используются только для программной обработки. Двоичный файл открывается на основе базового потока, в качестве которого чаще всего используется поток FileStream. Входной двоичный поток BinaryReader содержит перегруженные методы чтения для всех простых встроенных типов данных. Выходной поток BinaryWriter поддерживает произвольный доступ, т.е. имеется возможность выполнять запись в произвольную позицию двоичного файла.

Двоичные файлы являются файлами с произвольным доступом, при этом нумерация элементов в двоичном файле ведется с нуля. Произвольный доступ обеспечивает метод Seek. Рассмотрим его синтаксис:

Seek(long newPos, SeekOrigin pos), где параметр newPos определяет новую позицию внутреннего указателя файла в байтах относительно исходной позиции указателя, которая определяется параметром pos. В свою очередь параметр pos должен быть задан одним из значений перечисления SeekOrigin:

Значение

Описание

SeekOrigin.Begin

Поиск от начала файла

SeekOrigin.Current

Поиск от текущей позиции указателя

SeekOrigin.End

Поиск от конца файла

  1. Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.

Каждый класс файловых потоков содержит несколько вариантов конструкторов, с помощью которых можно создавать объекты этих классов различными способами и в различных режимах. Например, файлы можно открывать только для чтения, только для записи или для чтения и записи.

На уровне операционной системы файлы имеют байтовую организацию. Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream, который является наследником абстрактного класса Stream, определяющего набор стандартных операций с потоками.

Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream. При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи: FileStream(string filename, FileMode mode), где:

1. параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта.

2. параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode:

а)FileMode.Append—предназначен для добавления данных в конец файла;

б)FileMode.Create — предназначен для создания нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален;

в)FileMode.CreateNew — предназначен для создания нового файла, при этом файл с таким же именем не должен существовать;

г)FileMode.Open — предназначен для открытия существующего файла;

д)FileMode.OpenOrCreate — если файл существует, то открывает его, в противном случае создает новый;

е)FileMode.Truncate — открывает существующий файл, но усекает его длину до нуля;

Если попытка открыть файл оказалась неуспешной, то генерируется одно из исключений: FileNotFoundException — файл невозможно открыть по причине его отсутствия;

  • IOException — файл невозможно открыть из-за ошибки ввода-вывода;

  • ArgumentNullException — имя файла представляет собой null-значение;

  • ArgumentException — некорректен параметр mode;

  • SecurityException — пользователь не обладает правами доступа;

  • DirectoryNotFoundException — некорректно задан каталог.

Другая версия конструктора позволяет ограничить доступ только чтением или только записью: FileStream(string filename, FileMode mode, FileAccess how), где:

1.параметры filename и mode имеют то же назначение, что и в предыдущей версии конструктора;

2.параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess:

а) FileAccess.Read — только чтение;

б) FileAccess.Write — только запись;

в) FileAccess.ReadWrite — и чтение, и запись.

После установления связи байтового потока с физическим файлом внутренний указатель потока устанавливается на начальный байт файла.

Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte(). После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достигнут конец файла, то метод ReadByte() возвращает значение -1.

Для побайтовой записи данных в поток используется метод WriteByte().

По завершении работы с файлом его необходимо закрыть. Для этого достаточно вызвать метод Close(). При закрытии файла освобождаются системные ресурсы, ранее выделенные для этого файла, что дает возможность использовать их для работы с другими файлами.

При выводе в файл выводимые данные зачастую записываются на конкретном физическом устройстве не сразу. Вместо этого они буферизуются на уровне операционной системы до тех пор, пока не накопится достаточный объем данных, чтобы записать их сразу одним блоком. Благодаря этому повышается эффективность системы. Так, на диске файлы организованы по секторам величиной от 128 байтов и более. Поэтому выводимые данные обычно буферизуются до тех пор, пока не появится возможность записать на диск сразу весь сектор.

Но если данные требуется записать на физическое устройство без предварительного накопления в буфере, то для этой цели можно вызвать метод Flush: void Flush().При неудачном исходе данной операции генерируется исключение IOException. Если же поток закрыт, то генерируется исключение ObjectDisposedException.