Record2.javaのソース

パッケージ、カプセル化 直後のソース

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

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

	private String sho;	// 商品コード
	private 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;
	}

	// 商品コードの大小比較 引数の方が大きければ負、小さい時は正、等しいなら0を返します。
	public int compareTo(Record2 rec){
		return sho.compareTo(rec.sho);
	}

	//数量の情報取得メソッド
	public short getSuu(){
	    return suu;
	}
	//数量の情報設定メソッド
	public void setSuu(int suuData){
	    suu = (short)suuData;
	}
}