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; // 数量
//引数なしコンストラクタ
public Record2(){
}
//引数ありコンストラクタ
public Record2(String sho, int n){
init(sho, n);
}
//キー入力データで初期化するコンストラクタ
public Record2(Scanner stdin){
init(stdin);
}
//商品コードと数量を引数で設定するメソッド
public void init(String shoCode, int n) {
sho = shoCode;
suu = (short)n;
}
//商品コードと数量をキー入力
public void init(Scanner stdin) {
System.out.print(" 商品コード>>");
sho = stdin.nextLine();
System.out.print(" 数量>>");
String s = stdin.nextLine();
suu = (short)Integer.parseInt(s);
}
//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);
}
//レコードバイナリ読み込み (終端や、失敗時に、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;
}
}
Record3.javaのソース
package rec;
public class Record3 extends Record2
{
public int tanka; //単価
//引数なしコンストラクタ
public Record3(){
//スーパ(Recoed2)クラスのコンストラクタ書いていなくても実行される。
}
//商品コードと数量、単価をキー入力で生成するコンストラクタ
public Record3(String shoCode, int n, int price){
super(shoCode, n); // スーパークラスのコンストラクタを呼び出し
tanka = price;
}
//引数から入力するコンストラクタ
public Record3(java.util.Scanner stdin) {
init(stdin);//商品コードと数量、単価をキー入力
}
//商品コードと数量、単価を引数で変更
public void init(String shoCode, int n, int price){
super.init(shoCode, n);// スーパークラスのinitを呼び出す
//この場合はsuperを省略できます
tanka = price;
}
//商品コードと数量、単価をキー入力で変更
public void init(java.util.Scanner stdin)
{
super.init(stdin);// スーパークラスのinitを呼び出す
//この場合はsuperを省略でません。省略すると、
//自身を呼び出す(再帰)ため無限ループなり、StackOverflowErrorの実行エラーになる
System.out.print(" 単価>>");
String s = stdin.nextLine();
tanka = Integer.parseInt(s);
}
// 番号つき表示メソッド
public void display(int n){
super.display(n);// スーパークラスのdisplayを呼び出す
//この場合はsuperを省略でません。省略すると、
//自身を呼び出す(再帰)ため無限ループなり、
//StackOverflowErrorの実行エラーになる
System.out.printf("\t単価:%d\n", tanka);
}
}