Работа с бинарными файлами

Последнее обновление: 30.10.2015

Для работы с бинарными файлами в пространстве имен System.IO предназначены классы BinaryWriter и BinaryReader. Они позволяют записывать и считывать данные в двоичном формате.

Некоторые методы класса BinaryWriter

  • Close(): закрывает поток

  • Flush(): очищает буфер, сбрасывая из него оставшиеся данные в файл

  • Seek(): устанавливает позицию в потоке

  • Write(): записывает данные в поток

Основные метода класса BinaryReader

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850