Record2.javaのソース

(パッケージ化直前のファイル)

import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Record2
{
	public static String HIGH_VALUE = "Z99";
	// 存在しないデータで、商品コードはこの文字列より小さいコードとする

	public String sho;	// 商品コード
	public short suu;	// 数量

	//n番目表示としてオペレータ用で画面表示する
	public void display(int n) {
		System.out.printf("%4d番目レコード\n", n);
		System.out.printf("\t商品コード:%s\n", sho);
		System.out.printf("\t数量:%d\n", suu);
	}

	//商品コードと数量を引数で設定するメソッド
	public void init(String shoCode, int n)	{
		sho = shoCode;
		suu = (short)n;
	}

	//引数ありコンストラクタ
	public Record2(String sho, int n){
		init(sho, n);
	}

	//引数なしコンストラクタ
	public Record2(){
	}

	//商品コードと数量をキー入力
	public void init(Scanner stdin) {
		System.out.print("  商品コード>>");
		sho = stdin.nextLine();
		System.out.print("  数量>>");
		String s = stdin.nextLine();
		suu = (short)Integer.parseInt(s);
	}

	//キー入力データで初期化するコンストラクタ
	public Record2(Scanner stdin){
		init(stdin);
	}

	//レコードバイナリ読み込み (終端や、失敗時に、shoフィールドへHIGH_VALUEをセット)
	public boolean readFrom(FileInputStream fis)throws Exception{
		if (sho != null && sho.equals(Record2.HIGH_VALUE) == true) {
			return false;
		}

		byte[] a = new byte[6];
		int n = fis.read(a);//6byte読み込み
		if (n == -1) {
			sho = HIGH_VALUE;
			return false;
		}

		//文字コードを文字にして連結
		sho = "" + (char)a[0] + (char)a[1] + (char)a[2];

		suu = (short)(0x0ff & a[5]);
		suu <<= 8;	// 1バイト分左シフト(256倍している)
		suu |= 0x0ff & a[4]; //ビットORで結合
		return true;
	}

	//レコードをバイナリで書き出す
	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; 書かなくてもが設定されているはず

		a[4] = (byte)(suu & 0x0ff);//shortをbyte列に変換
		a[5] = (byte)(suu >> 8);

		fos.write(a);//ファイルへ、まとめて書き込む
		return true;
	}
}