VB.NETでバイナリファイルを読み書きする方法を完全ガイド!初心者でもわかるBinaryReaderとBinaryWriter
生徒
「VB.NETで『バイナリファイル』を扱いたいのですが、普通のテキストファイルと何が違うんですか?」
先生
「テキストファイルは人間が読んで理解できる文字の集まりですが、バイナリファイルは画像や音楽、設定データなど、コンピューターが効率よく処理するための生データの集まりのことですよ。」
生徒
「難しそうですね。私のような初心者でも読み書きできるようになりますか?」
先生
「大丈夫です。VB.NETにはBinaryWriterとBinaryReaderという専用の道具があります。これらを使えば、一つずつ順番にデータを出し入れするだけで簡単に操作できます。さっそく基本から学んでいきましょう!」
1. バイナリファイルとBinaryWriterの基本
プログラミングの世界では、データを保存する形式が大きく分けて二つあります。一つはメモ帳で開いて中身が読める「テキストファイル」、もう一つが今回学習する「バイナリファイル」です。バイナリファイルは、文字として表示できない数値そのものや、特殊な記号をそのまま保存するため、ファイルサイズを小さくできたり、処理速度が速かったりするという利点があります。
VB.NETでこのバイナリファイルにデータを書き込むために使うのが、BinaryWriter(バイナリライター)というクラスです。「Writer」は「書き手」という意味ですね。これを使うことで、数値や文字などのデータをバイナリ形式に変換してファイルへ保存することができます。まずは、一番シンプルな書き込みの例を見てみましょう。
Imports System.IO
Module Module1
Sub Main()
' 保存するファイルのパスを指定します
Dim filePath As String = "C:\temp\test.dat"
' BinaryWriterを使ってファイルを作成し、書き込みます
' File.OpenWriteでファイルを開き、それをBinaryWriterに渡します
Using writer As New BinaryWriter(File.OpenWrite(filePath))
' 整数(Integer)を書き込みます
writer.Write(100)
' 小数(Double)を書き込みます
writer.Write(123.45)
' 文字列(String)を書き込みます
writer.Write("こんにちは")
End Using
Console.WriteLine("ファイルの書き込みが完了しました。")
End Sub
End Module
2. データを読み込むBinaryReaderの使い方
ファイルに書き込んだデータは、当然ながら後で読み出す必要があります。バイナリファイルからデータを取り出すときに使うのが、BinaryReader(バイナリリーダー)です。「Reader」は「読み手」という意味です。バイナリファイルを読み込む際に最も大切なルールは、「書き込んだ順番通りに読み込む」ということです。例えば、最初に整数を書き込んだのなら、読み込むときも最初に整数として読み込まなければなりません。この順番が狂うと、データが壊れてしまい、正しい値を取得できなくなります。
ここでは、先ほど作成したファイルからデータを読み出すプログラムを作成してみます。読み込むときは、データの型(整数なのか、文字なのか)に合わせて、ReadInt32やReadStringといった専用の命令を使い分けます。
Imports System.IO
Module Module2
Sub Main()
Dim filePath As String = "C:\temp\test.dat"
' ファイルが存在するか確認します
If File.Exists(filePath) Then
' BinaryReaderを使ってファイルを読み込みます
Using reader As New BinaryReader(File.OpenRead(filePath))
' 書き込んだ順序(整数、小数、文字列)で読み込みます
Dim intVal As Integer = reader.ReadInt32()
Dim dblVal As Double = reader.ReadDouble()
Dim strVal As String = reader.ReadString()
' 結果を画面に表示します
Console.WriteLine("読み込んだ整数: " & intVal)
Console.WriteLine("読み込んだ小数: " & dblVal)
Console.WriteLine("読み込んだ文字列: " & strVal)
End Using
End If
End Sub
End Module
読み込んだ整数: 100
読み込んだ小数: 123.45
読み込んだ文字列: こんにちは
3. 専門用語の解説と身近な例え
ここで、少し難しい用語が出てきたので整理しておきましょう。プログラミング未経験の方にとって、バイナリ操作は「魔法の箱」のように見えるかもしれませんが、実はとても論理的です。
- ストリーム (Stream): データの流れる川のようなものです。ファイルとプログラムの間でデータが行き来する通り道を指します。
- Using(ユージング)句: 「この道具を使います」と宣言し、使い終わったら自動的に片付けてくれる便利な仕組みです。これを使わないと、ファイルを開きっぱなしにしてしまい、他のソフトでそのファイルが開けなくなるなどのトラブルが起きます。
- バイト (Byte): コンピューターが扱う最小のデータ単位です。バイナリファイルはこのバイトが並んだものです。
例えるなら、バイナリファイルへの書き込みは「細いチューブに、決まった形のブロックを順番に詰め込んでいく作業」です。四角いブロック(整数)の次に丸いブロック(文字列)を入れたなら、取り出すときも出口から四角、丸の順でしか取り出せません。この「形」を間違えると、チューブの中でブロックが詰まったり、壊れたりしてしまうのです。
4. 複数のデータを繰り返し書き込む方法
実際の開発では、一つのデータだけでなく、たくさんのデータをまとめて保存したい場面が多くあります。例えば、ゲームのキャラクターのステータスや、家計簿のデータなどです。このような場合は、ループ処理(For文)を組み合わせてバイナリファイルを作成します。繰り返し同じ形式のデータを書き込むことで、大量の情報を効率よく管理できるようになります。以下の例では、複数の数値をまとめて保存する方法を紹介します。
Imports System.IO
Module Module3
Sub Main()
Dim filePath As String = "C:\temp\scores.dat"
Dim scores As Integer() = {85, 92, 78, 64, 99}
' 配列のデータをすべて書き込みます
Using writer As New BinaryWriter(File.Open(filePath, FileMode.Create))
' データの個数を最初に書き込んでおくと読み込みが楽になります
writer.Write(scores.Length)
' 各スコアを順番に書き込みます
For Each s As Integer In scores
writer.Write(s)
Next
End Using
Console.WriteLine("配列データの保存が完了しました。")
End Sub
End Module
5. 条件に合わせたファイルの開き方(FileMode)
ファイルを操作するとき、「新しく作り直したい」場合もあれば、「今あるファイルの後ろに追記したい」場合もあります。これを制御するのがFileMode(ファイルモード)という設定です。バイナリファイルを扱う際によく使われる設定を覚えておきましょう。
- Create: 常に新しいファイルを作成します。もし同じ名前のファイルが既にある場合は、中身を全部消して上書きします。
- Open: 既存のファイルを開きます。ファイルが存在しないとエラーになります。
- Append: ファイルの末尾にデータを付け足します。ログの記録などに便利です。
初心者のうちは、まず「Create」で練習し、慣れてきたら「Open」で中身を読み取るという流れを意識するとスムーズです。ファイルの場所を指定するときは、パス(住所のようなもの)が正しいかしっかり確認してくださいね。
6. エラーを防ぐためのポイントと注意点
バイナリファイルの読み書きで最も多い失敗は、「読み込もうとしたデータの型が、書き込んだ時と違う」というものです。例えば、Integer型(4バイトの整数)で保存した場所を、ReadBoolean(1バイトの真偽値)で読み込もうとすると、データがズレてしまい、その後すべての読み込みが無茶苦茶になります。これを防ぐためには、データの構造を「設計図」としてメモしておくことが大切です。
また、ファイル操作には常に「ファイルが見つからない」「別のプログラムが使用中」といったリスクが伴います。そのため、実務ではTry...Catch(トライ・キャッチ)という構文を使って、エラーが起きてもプログラムが強制終了しないようにガードを固めるのが一般的です。まずは基本の読み書きをマスターしてから、こうした応用的な守りの技術を学んでいきましょう。
Imports System.IO
Module Module4
Sub Main()
Dim filePath As String = "C:\temp\config.dat"
' 書き込み処理
Using writer As New BinaryWriter(File.Create(filePath))
writer.Write(True) ' 設定オン
writer.Write(2026) ' 年号
End Using
' 読み込み処理
Using reader As New BinaryReader(File.OpenRead(filePath))
' PeekCharは次にデータがあるか確認する時に使えます
If reader.PeekChar() <> -1 Then
Dim isEnabled As Boolean = reader.ReadBoolean()
Dim currentYear As Integer = reader.ReadInt32()
Console.WriteLine("設定: " & isEnabled)
Console.WriteLine("年度: " & currentYear)
End If
End Using
End Sub
End Module
7. バイナリ操作の学習を深めるために
VB.NETのファイル操作は非常に奥が深いです。BinaryWriterやBinaryReaderを使いこなせるようになると、独自のファイル形式を作ってデータを保存したり、ネットワークを通じてデータを送受信したりする基礎体力がつきます。パソコンに触ったことがない方でも、一つひとつの命令の意味を「誰かに手紙を書く作業」のように捉えれば、きっと理解できるはずです。
最初は難しく感じるかもしれませんが、自分で書いたコードでファイルが出来上がり、それを再び読み込めた時の感動はプログラミングの醍醐味です。キーワードとして「ストリーム」「バッファ」「エンコード」といった言葉も重要になってきますが、まずは目の前の読み書きを何度も練習して、体で覚えていくことをおすすめします。失敗を恐れず、色々なデータをバイナリで保存してみてください。