C#でバイナリファイルを読み込む

C#でバイナリファイルを読み込むには System.IO.FileStream クラスと System.IO.BinaryReader クラスを使います。

ここでは FileStream クラスと BinaryReader クラスの基本的な使い方についてまとめてみます。

FileStreamとBinaryReaderの役割

FileStreamクラス

ファイル名を指定してファイルの中身を読み書きする為のクラスです。

データは 1byte づつもしくは byte 配列で読み書きする為のメソッドがありますが、それだけでは不便なので BinaryReader クラスと合わせて使う事でより手軽にバイナリファイルの読み込みが行えるようになります。

BinaryReaderクラス

Stream クラスから、intdouble などの型単位でデータを読み込むためのクラスです。

使用する Stream クラスはコンストラクタでを指定します。

ファイルからデータを読み込むには Stream クラスから派生した FileStreamクラスを指定します。

ファイルを開く

FileStream オブジェクトを生成すると、ファイルがオープンされて内容を読み込める状態になります。

 

読み込みたいファイルの名前はコンストラクタの引数に渡します。

この他コンストラクタには FileMode などを指定する事が出来ます。

 

FileMode

  • FileMode.CreateNew   ・・・新しいファイルを作成(ファイルが存在する場合Truncatと同じ)
  • FileMode.Create     ・・・新しいファイルを作成(ファイルが存在する場合例外がスロー)
  • FileMode.Open      ・・・ファイルを開く(ファイルが存在しない場合例外がスロー)
  • FileMode.OpenOrCreate  ・・・ファイルが存在する場合は開き、存在しない場合は新しいファイルを作成
  • FileMode.Truncate     ・・・ファイルは開かれると、サイズが 0 バイトになるように切り詰め
  • FileMode.Append     ・・・ファイルが存在する場合は開き、ファイルの末尾をシーク

 

 

生成したFileStreamを使って BinaryReader オブジェクトを生成します。

 

 

    var fileName = @"c:\test.dat";
    var reader = new BinaryReader(new FileStream(fileName, FileMode.Open);

ファイルを読む

BinaryReader クラスには様々な型でデータを読み込むメソッドが用意されています。

 

  • ReadBytes(Int32)  ・・・指定されたバイト数をバイト配列に読み取り
  • ReadByte()     ・・・1 バイト符号付きを読み取り
  • ReadInt16()      ・・・2 バイト符号付き整数を読み取り
  • ReadInt32()      ・・・4 バイト符号付き整数を読み取り
  • ReadInt64()      ・・・8 バイト符号付き整数を読み取り
  • ReadSByte()     ・・・1 バイト符号なし整数を読み取り
  • ReadUInt16()    ・・・2 バイト符号なし整数を読み取り
  • ReadUInt32()    ・・・4 バイト符号なし整数を読み取り
  • ReadUInt64()    ・・・8 バイト符号なし整数を読み取り
  • ReadSingle()     ・・・4 バイト浮動小数点値を読み取り
  • ReadDouble()    ・・・8 バイト浮動小数点値を読み取り

 

ファイルを閉じる

ファイルは開いたら必ず閉じる必要があります。

ファイルを閉じるには StreamReader クラスの Close() メソッドを呼び出します。

Close は finally で

ファイルの読み込み中に例外が発生する可能性がある事を必ず考慮してコードを書きましょう。

try ... finally ステートメントの finally ブロックで Close() を呼び出す事で例外発生時にも対応したコードを書くことが出来ます。

    var fileName = @"c:\test.dat";
    var reader = new BinaryReader(new FileStream(fileName, FileMode.Open);
    try
    {
        //読み込む処理
        var data1 = reader.ReadUInt32();
        var data2 = reader.ReadUInt16();
        var data3 = reader.ReadDouble();
       :
       :

    }
    finally
    {
        reader.Close();
    }

Close の代わりに using を使う

StreamReader クラスは IDisposable インターフェースをもっているので、Close() メソッドのかわりに using 構文を使う事も出来ます。

 

下記の例は、上の try … finally を使ったコードと全く同じ動きをします。

using ブロックを抜けた時点で(例外が起きる起きないにかかわらず)IDispposableインターフェースの Dispose() メソッドが呼ばれます。この Dispose() でファイルを閉じる処理が行われます。

    var fileName = @"c:\test.dat";
    using (var reader = new BinaryReader(new FileStream(fileName, FileMode.Open))
    {
        //読み込む処理
        var data1 = reader.ReadUInt32();
        var data2 = reader.ReadUInt16();
        var data3 = reader.ReadDouble();
       :
       :

    }

 

関連記事