(パッケージ化直前のファイル)
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;
}
}