C#でバイナリファイルを読み込むには System.IO.FileStream クラスと System.IO.BinaryReader クラスを使います。
ここでは FileStream クラスと BinaryReader クラスの基本的な使い方についてまとめてみます。
FileStreamとBinaryReaderの役割
FileStreamクラス
ファイル名を指定してファイルの中身を読み書きする為のクラスです。
データは 1byte づつもしくは byte 配列で読み書きする為のメソッドがありますが、それだけでは不便なので BinaryReader クラスと合わせて使う事でより手軽にバイナリファイルの読み込みが行えるようになります。
BinaryReaderクラス
Stream クラスから、int や double などの型単位でデータを読み込むためのクラスです。
使用する Stream クラスはコンストラクタでを指定します。
ファイルからデータを読み込むには Stream クラスから派生した FileStreamクラスを指定します。
ファイルを開く
FileStream オブジェクトを生成すると、ファイルがオープンされて内容を読み込める状態になります。
読み込みたいファイルの名前はコンストラクタの引数に渡します。
この他コンストラクタには FileMode などを指定する事が出来ます。
- FileMode.Create ・・・新しいファイルを作成(ファイルが存在する場合Truncatと同じ)
- FileMode.CreateNew ・・・新しいファイルを作成(ファイルが存在する場合例外がスロー)
- 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(); : : }
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください
(ぱ) (土曜日, 07 5月 2022 00:07)
古い記事にすみませんが、FileMode.CreateとCreateNewの説明が逆ではないでしょうか?
AraramiStudio (火曜日, 17 5月 2022 11:52)
(ぱ)さん
ご指摘ありがとうございます。
記事本文を修正しました。