TextReader, TextWriter и производные классы. Объектные потоки: сохранение и восстановление объектов.
Данные записываются в поток методами Write и WriteLine. Что касается чтения, в вашем распоряжении два способа. В наиболее распространенном варианте программа в цикле читает строки до тех пор, пока очередная прочитанная строка не окажется равной Nothing. В программе это выглядит примерно так:
Dim s As String Do s = theStreamReader.ReadLine If Not s Is Nothing Then ' Выполнить нужные действия с s. ' Например, вызвать Console.WriteLine(s). End If Loop Untils Is Nothing
Также можно воспользоваться методом Peek и проверить, равен ли следующий читаемый символ -1 (признак конца файла):
Do Until theStreamReader.Peek = -1
В качестве примера использования класса TextReader ниже приводится простая процедура, предназначенная для вывода текстового файла на экран. Обратите внимание: в строках 5-17 весь важный код заключен в блок Try-Catch-Finally. В этом блоке программа пытается закрыть открытый поток независимо от того, что произошло при операциях с ним. Как упоминалось выше, перед вызовом Close в строке 16 сначала необходимо убедиться в том, что поток был успешно создан. Также обратите внимание на то, как в строке 14 к инициируемому исключению добавляется содержательное сообщение. В реальной программе следовало бы определить новый класс исключения (за подробностями обращайтесь к главе 7).
1 Sub DisplayTextFile(ByVal fName As String) 2 Dim myFile As FileStream 3 Dim textFile As StreamReader 4 Dim stuff As String 5 Try 6 myFile = New FileStream(fName.FileMode.Open, FileAccess.Read) 7 textFile = New StreamReader(myFile) 8 stuff = textFile.ReadLine() 9 Do Until stuff Is Nothing 10 Console.WriteLine(stuff) 11 stuff = textFile.ReadLine() 12 Loop 13 Catch e As Exception 14 Throw New Exception("If the file existed.it was closed") 15 Finally 16 If Not (myFile Is Nothing)Then myFile.Close() 17 End Try 18 End Sub 19 End Module
В общем случае отдельные строки файла можно сохранить в динамическом массиве ArrayList (если, конечно, количество строк относительно невелико). Для этого достаточно внести минимальные изменения в предыдущую программу. В заголовок процедуры добавляется новый параметр:
Sub DisplayTextFile(ByVal fName As String,ByVal where As ArrayList)
Строка 10 приводится к следующему виду:
where, Add(stuff)
Объектные потоки: сохранение и восстановление объектов
Объектно-ориентированное программирование вряд ли получило бы столь широкое признание, если бы программист не мог сохранить объект в текущем состоянии и восстановить его позднее. Запись объекта в поток данных называется сериализацией (serialization), а обратный процесс называется десериализацией (deserialization). В нескольких ближайших разделах мы познакомим читателя с основными принципами сериализации и десериализации.
Но прежде, чем переходить к рассмотрению новой темы, следует заметить, что это более сложная и тонкая проблема, чем кажется на первый взгляд. Почему? Одна из причин заключается в том, что объект может содержать другие объекты (вспомните классы Manager и Secretary из главы 5). Следовательно, процесс сохранения должен поддерживать рекурсивное сохранение внутренних объектов. Более того, при этом необходимо позаботиться об отсутствии дублирования.
Если на 100 программистов в отделе приходится одна секретарша, было бы нежелательно сохранять данные секретарши в 100 экземплярах, когда вполне достаточно одного экземпляра с соответствующей настройкой ссылок (нечто похожее происходит при приведении баз данных к нормальной форме с исключением избыточных данных).
К счастью, в .NET Framework сохранение объектов не требует особых усилий со стороны программиста. Как будет вскоре показано, объекты можно сохранять даже в понятном для человека формате SOAP (Simple Object Access Protocol), основанном на языке XML.