
10.1.2. Позиция в файле
Класс FileStream поддерживает указатель файла, который указывает на местоположение внутри файла, где произойдет следующая операция чтения или записи. Когда файл открывается, этот указатель установлен на начало файла, но этот указатель можно перемещать. Это позволит приложению читать или писать в любом месте файла, позволяя организовать произвольный доступ к файлу. Это экономит время при работе с очень большими файлами.
Метод Seek(), реализующий эту функцию, принимает два параметра. Первый параметр указывает, насколько байт нужно переместить указатель файла. Второй параметр показывает, откуда начинать отсчет, в форме значения из перечисления SeekOrigin. Параметр SeekOrigin может принимать одно из трех значений: Begin, Current и End.
Например, следующая строка переместит указатель файла к восьмому байту файла, начиная с самого первого в этом файле:
aFile.Seek (8, SeekOrigin.Begin);
Следующая строка переместит указатель файла на два байта вперед, начиная с текущей позиции:
aFile.Seek (2, SeekOrigin.Current);
При чтении или записи положение файлового указателя изменяется на число записанных или прочитанных байтов.
Допустимо указывать отрицательное значение смещения, которое может быть скомбинировано со значением SeekOrigin.End или SeekOrigin.Current. Следующий оператор переносит указатель файла на пять байтов от конца файла:
aFile.Seek(-5, SeekOrigin.End);
Такие файлы называются файлами прямого доступа, потому что можно обращаться к любой позиции внутри файла. Классы Stream, описанные далее, обращаются к файлам последовательно и не позволяют манипулировать указателями.
10.2. Текстовые классы
Таблица 10.5.
Методы ввода данных, определенные в классе TextReader
Метод |
Описание |
void close () |
Закрывает источник ввода данных |
int Peek () |
Получает следующий символ из входного потока, но не удаляет его. Возвращает значение - 1 , если ни один символ не доступен |
int Read () |
Возвращает целочисленное представление следующего доступного символа из вызывающего объекта входного потока. При обнаружении конца файла возвращает значение -1 |
int Read (char [] buf, int offset, int numChars) |
Делает попытку прочитать numChars символов в массив buf, начиная с элемента buf[offset], и возвращает количество успешно прочитанных символов |
int ReadBlock(char[] buf, int offset, int numChars) |
Делает попытку прочитать numChars символов в массив buf, начиная с элемента buf[offset], и возвращает количество успешно прочитанных символов |
string ReadLine() |
Считывает следующую строку текста и возвращает ее как string-значение. При попытке прочитать признак конца файла возвращает null-значение |
string ReadToEnd() |
Считывает все символы, оставшиеся в потоке, и возвращает их как string-значение |
В классе TextWriter определены версии методов Write() и WriteLine(), которые могут выводить данные всех встроенных типов. Приведем, например, только некоторые их перегруженные версии.
Таблица 10.6.
Метод |
Описание |
void Write(int val) |
Записывает значение типа int |
void Write(double val) |
Записывает значение типа double |
void Write(bool val) |
Записывает значение типа bool |
void WriteLine(string val) |
Записывает значение типа string с последующим символом новой строки |
void WriteLine(uint val) |
Записывает значение типа uint с последующим символом новой строки |
void WriteLine(char val) |
Записывает символ с последующим символом новой строки |
string NewLine() |
Записывает признак конца строки |
void Flush() |
Записывает все данные, оставшиеся в выходном буфере и очищает буфер |
void Encoding() |
Получает кодировку, в которой производится запись |
void Close() |
Закрывает поток |
Из классов TextReader и TextWriter выведен ряд символьно-ориентированных потоковых классов, в том числе и те, что перечислены в следующей таблице. Эти потоковые классы используют методы и свойства, определенные в классах TextReader и TextWriter.
Таблица 10.7.
Класс |
Описание |
StreamReader |
Предназначен для чтения символов из байтового потока. Этот класс является оболочкой для байтового входного потока |
StreamWriter |
Предназначен для записи символов в байтовый поток. Этот класс является оболочкой для байтового выходного потока |
StringReader |
Предназначен для чтения символов из строки |
StringWriter |
Предназначен для записи символов в строку |