前のページで利用した次のバイナリファイルを作成するプログラムを考えます。
前のページ参考⇒(確認後はブラウザの戻る操作で戻ってください)
0000 41 30 31 00 04 00 41 30 31 00 05 00 41 30 31 00 0010 01 00 41 30 33 00 05 00 42 30 32 00 03 00 42 30 0020 32 00 09 00 42 30 33 00 0A 00
上記で、 41 30 31 00 04 00の部分が
先頭レコードの部分です。
このような1レコード分を書き込むメソッドを、writeToの名前でRecord2クラスに用意します。
writeToメソッドは、次のように使えれば便利でしょう。
import java.io.FileOutputStream; public class Test { public static void main(String[] arg) throws Exception { Record2[] a = new Record2[]{ new Record2("A01", 4),//コンストラクタ new Record2("A01", 5),//コンストラクタ new Record2("A01", 1),//コンストラクタ new Record2("A03", 5),//コンストラクタ new Record2("B02", 3),//コンストラクタ new Record2("B02", 9),//コンストラクタ new Record2("B03", 10),//コンストラクタ }; FileOutputStream fos = new FileOutputStream("transact0.bin");//ファイル生成 for (int i = 0; i < a.length; i++) { a[i].display(i + 1);//表示 a[i].writeTo(fos);//ファイル書き込み } fos.close(); } }
writeToはバイトのストリームを引数にし、
一回の実行で、shoとsuuをバイト列にして出力します。
なお、shoが商品コードとならないHIGH_VALUEの場合は、出力しないようにします。
以下にこのコードを示します。
Record2.javaに実装するwriteToメソッドのコードを以下に示します。
//レコードをバイナリで書き出す public boolean writeTo(FileOutputStream fos) throws Exception { if (sho.equals(HIGH_VALUE) == true) { return false;//終端を意味するデータは出力しない。 } byte[] a = new byte[6]; a[0] = (byte)sho.charAt(0);//各文字を順番にbyteへ配列にセットする a[1] = (byte)sho.charAt(1); a[2] = (byte)sho.charAt(2); // a[3] = 0; 書かなくても 0が設定されているはず a[4] = (byte)(suu & 0x0ff);//shortをbyte列に変換 a[5] = (byte)(suu >> 8); fos.write(a);//ファイルへ、まとめて書き込む return true; }
以下にwriteToメソッドを実装したRecord2のクラス図を示します。