Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

9.Потоки ввода/вывода в c#. Создание объекта потока и работа с ним. Текстовые, бинарные потоки, потоки со сжатием данных.

// Пояснение: String[Reader/ Writer] = StringReader и StringWriter

Поток (stream) — абстрактный объект, который производит или потребляет информацию (хранит данные в линейной манере и так же обеспечивает доступ к ним: по одному байту за раз.)

Существуют потоки: Выходные - используются, когда данные пишутся в некоторое внешнее место назначения, например физический дисковый файл, местоположение в сети, принтер или другая программа. Входные - используются для чтения данных в память или переменные, к которым может обращаться ваша программа. Также потоки бывают двоичные и текстовые, односторонние и двусторонние.

Для чтения/записи с пульта используются методы класса Console.

Пространство имен System.IO содержит все потоковые классы. Базовый класс Stream - от него можно породить все потоки.

Служебные классы (они статические) File и Directory предоставляют множество статических методов для манипулирования файлами и каталогами.

Методы для File: Сору() — Копирует файл из исходного местоположения в целевое; Create() —Создает файл по указанному пути; Delete() —Удалят файл; Open() —Возвращает объект FileStream, находящийся по указанному пути; Move() — Перемещает указанный файл в новое место. Методы для Directory: CreateDirectory() - Создает каталог с указанным путем Delete () Удалят указанный каталог и все файлы внутри него; GetDirectories() - Возвращает массив объектов string, представляющих имена каталогов внутри указанного каталога; GetFiles() - Возвращает массив объектов string, представляющих имена файлов, находящихся в указанном каталоге; GetFileSystemEntnes() - Возвращает массив объектов string, представляющих имена файлов и каталогов внутри указанного каталога Move () Перемещает указанный каталог в новое место.

Классы FileInfo и DirectoryInfo не являются статическим. Они позволяют узнать информацию о файле/каталоге. Эти классы полезны только при создании его экземпляров. Например: cоздание объекта: Filelnfo а = new FileInfo (@"C:\Log.txt").

BufferedStream — буферный поток.

Класс FileStream используется для создания байтового потока, прикрепленного к файлу. Его определяет несколько конструкторов, например: FileStream(string имя файла FileMode режим). имя файла — имя открываемого файла, режим — как открыть файл. Например, FileMode.Append — файл откроется только для записи (вывод добавляется в коней файла). Он поддерживает форматеры — специальные классы, которые реализуют интерфейс IFormatter.

Для чтения используются 2 метода:

ReadByte() - читает 1 байт из файла. Возращает -1, когда достигнул конца файла.

Read() - читает блок байтов.

Для записи: WriteByte().

Для работы с символьно-ориентированными потоками используют обертки вокруг бaйтового потока StreamReader(чтение) и StreamWriter(запись). Эти классы автоматически преобразуют байтовый поток в символьный и наоборот. Они являются производными от классов Text[Reader/Writer].

String[Reader/ Writer] — чтение/запись в оперативную память целыми строками.

Binary[Reader/ Writer]— обертки вокруг байтового, которые управляют чтением/записью двоичных данных.

Пространством имен System.IO.Compression— позволяет читать и писать в сжатые файлы, применяя либо сжатие GZIP, либо схему сжатия Deflate. Потоки GZipStream и DeflateStream обеспечивают автоматическое сжатие данных при записи или распаковку при чтении. Их разница в реализуемом алгоритме GZIP или Deflate.

В обоих случаях они инициализируются существующим потоком, которым в случае файлов является объект FileStream. После этого их можно использовать вместе с StreamReader и StreamWriter, как и любой другой поток. Все, что потребуется сделать в дополнение указать — будет ли поток использоваться для сжатия (сохранения файлов) или распаковки (загрузки файлов), чтобы класс знал, что делать с переданными ему данными.

10. XML-документы и сериализация объектов в XML-документ. Условия применения. Шаблон применения.

Extensible Markup Language (XML) — расширяемый язык разметки. Это способ хранения данных в простом текстовом формате, т.е. он может быть прочитан почти на любом компьютере. Документом XML может быть физический файл на компьютере или просто строка в памяти. Например, определить элемент для хранения заголовка книги можно следующим образом:

<book>Tristram Shandy</book>

Элементы также могут содержать в себе другие элементы, так что вы можете моди­фицировать элемент <book> таким образом, чтобы включить информацию об авторе наряду с заголовком книги в двух подэлементах:

<book>

<title>Tristram Shandy</title>

<author>Lawrence Sterne</author>

</book>

XML-документы могут содержать множество других составных частей; Элементы, текст внутри элементов и атрибуты — все это узлы документа XML(nodes). Один тип узла появляется почти в каждом документе XML. Это объявление XML, и если вы его включаете, оно должно находиться в первом узле документа.

Объявление XML по своему формату подобно элементу, но имеет внутри себя во­просительные знаки и угловые скобки. Оно всегда имеет имя xml и всегда снабжено атрибутом по имени version; в настоящее время единственное допустимое значение для него — "1.0". Простейшая возможная форма XML-объявления такова:

<?xml version="l.0"?>

Данные XML структурированы иерархически. Каждый документ должен иметь единственный корневой элемент, внутри которого содержатся все элементы и тексто­вые данные. Если на вершине документа находится более одного элемента, то такой документ не считается правильным документом XML. Правильный документ XML:

<?xml version="l.0"?>

<books>

<book>Tristram Shandy</book> <book>Moby Dick</book> <book>Ulysses</book> </books>

Нет ограничений на число подэлементов, которые может содержать элемент. Для правильного документа XML характерно:

  1. Иметь один, и только один корневой элемент.

  2. Иметь закрывающие дескрипторы для каждого элемента (за исключением со­кращенного синтаксиса, упомянутого ранее).

  3. Не иметь перекрывающихся элементов — все дочерние элементы должны быть полностью помещены внутри родителя.

  4. Иметь все атрибуты, заключенные в скобки.

Сериализация XML – это процесс преобразования открытых свойств и полей объекта в серийный формат XML для хранения и транспортировки. Десериализация пересоздает объект в его исходном состоянии из вывода XML. Сериализацию можно представить в качестве способа сохранения состояния объекта в поток или буфер.

Для передачи данных между объектами и XML требуется сопоставление из конструкций языка программирования в схему XML и из схемы XML в конструкции языка программирования. XmlSerializer (сериализует объект в поток) и связанные инструменты предоставляют мост между данными двумя технологиями во время разработки и выполнения. Во время выполнения экземпляры классов могут быть сериализованы в документы XML, удовлетворяющие заданной схеме. Аналогично, данные документы XML могут быть десериализованы в объекты времени выполнения.

XmlSerializer обеспечивает преимущество работы с классами строгих типов и, в то же время, обеспечивает гибкость XML. С помощью полей или свойств типа XmlElement, XmlAttribute или XmlNode в классах строгих типов можно считывать части документа XML непосредственно в объекты XML.

При работе в расширяемых схемах XML можно также использовать атрибуты XmlAnyElementAttribute и XmlAnyAttributeAttribute для сериализации и десериализации элементов или атрибутов, не обнаруженных в исходной схеме.

Если свойство или поле возвращает сложный объект (например, массив или экземпляр класса), XmlSerializer преобразует его в элемент, вложенный в рамках основного документа XML.

XmlSerializer предоставляет специальную обработку для классов, реализующих IEnumerable или ICollection. Класс, реализующий IEnumerable, должен реализовывать открытый метод Add, принимающий один параметр. Параметр метода Add должен быть того же типа, что и тип, возвращенный из свойства Current по значению, возвращенному из GetEnumerator, или одним из базовых типов. Класс, реализующий ICollection (например, CollectionBase), в дополнение к IEnumerable должен иметь открытое индексированное свойство Item (индексатор в C#), принимающее целое значение, а также должен иметь открытое свойство Count целого типа. Параметр для метода Add должен быть того же типа, что и тип возвращенного значения из свойства Item или быть одним из базовых типов. Для классов, реализующих ICollection, сериализуемые значения извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]