Для работы с бинарными файлами в пространстве имен 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. Это будет означать, что мы
достигли конца файла. И для получения значений полей нам надо считать их из файла в том же порядке,в каком они в него записывались.