Для работы с бинарными файлами в пространстве имен System.IO предназначены классы BinaryWriter и BinaryReader. Они позволяют записывать и считывать данные в двоичном формате.
Close(): закрывает поток
Flush(): очищает буфер, сбрасывая из него оставшиеся данные в файл
Seek(): устанавливает позицию в потоке
Write(): записывает данные в поток
Close(): закрывает поток и освобождает ресурсы
ReadBoolean(): считывает значение Boolean и перемещает указатель на один байт
ReadByte(): считывает один байт и перемещает указатель на один байт
ReadChar(): считывает значение Сhar, то есть один символ, и перемещает указатель на столько байтов, сколько занимает символ в текущей кодировке
ReadDecimal(): считывает значение Decimal и перемещает указатель на 16 байт
ReadDouble(): считывает значение Double и перемещает указатель на 8 байт
ReadInt16(): считывает значение Short и перемещает указатель на 2 байта
ReadInt32(): считывает значение Integer и перемещает указатель на 4 байта
ReadInt64(): считывает значение Long и перемещает указатель на 8 байт
ReadSingle(): считывает значение Single и перемещает указатель на 4 байта
ReadString(): считывает значение String. Каждая строка предваряется значением длины строки, которое представляет 7-битное целое число
Теперь рассмотрим, как мы можем использовать эти классы в реальной задаче. Допустим, у нас есть массив структур, которые мы хотим хранить в файле:
Imports System.IO Module Module1 Sub Main() Dim states As State() = New State(2) {} states(0) = New State("Россия", "Москва", 3756588, 145.5) states(1) = New State("Украина", "Киев", 603700, 55.4) states(2) = New State("Белорусь", "Минск", 207599, 9.4) Dim path As String = "C:\SomeDir\states.dat" Try ' создаем объект BinaryWriter Using writer As New BinaryWriter(File.Open(path, FileMode.OpenOrCreate)) 'записываем в файл значение каждого поля структуры For Each s As State In states writer.Write(s.name) writer.Write(s.capital) writer.Write(s.area) writer.Write(s.population) Next End Using 'создаем объект BinaryReader Using reader As New BinaryReader(File.Open(path, FileMode.Open)) 'пока не достигнут конец файла 'считываем каждое значение из файла While reader.PeekChar() > -1 Dim name As String = reader.ReadString() Dim capital As String = reader.ReadString() Dim area As Integer = reader.ReadInt32() Dim population As Double = reader.ReadDouble() Console.WriteLine("Страна: {0} столица: {1} площадь {2} кв. км численность населения: {3} млн. чел.", name, capital, area, population) End While End Using Catch ex As Exception Console.WriteLine(ex.Message) End Try Console.ReadLine() End Sub Structure State Public name As String Public capital As String Public area As Integer Public population As Double Sub New(name As String, capital As String, area As Integer, population As Double) Me.name = name Me.capital = capital Me.area = area Me.population = population End Sub End Structure End Module
В конце кода мы определили структуру State, которая имеет ряд полей. В методе Main создаем массив структур и записываем с помощью
объекта BinaryWriter. Для создания объекта BinaryWriter нам надо передать в конструктор в качестве параметра объект Stream, который создается
вызовом File.Open(path, FileMode.OpenOrCreate)
.
Послк этого пробегаемся в цикле по массиву структур и записываем каждое поле структуры в поток. В том порядке, в каком они значения полей записываются, в том порядке они и будут размещаться в файле.
Затем считываем из записанного файла. Конструктор класса BinaryReader также в качестве параметра принимает объект потока, только в данном
случае устанавливаем в качестве режима FileMode.Open: new BinaryReader(File.Open(path, FileMode.Open))
В цикле while
считываем данные. Вызов метода PeekChar()
помогает нам установить конец потока. Этот метод считывает
следующий символ в потоке и возвращает его числовое представление. Если символ отсутствует, то метод возвращает -1. Это будет означать, что мы
достигли конца файла. И для получения значений полей нам надо считать их из файла в том же порядке,в каком они в него записывались.