1

Book クラスと、Book を拡張する Library Book クラスがあります。ランダムアクセスファイルに情報を保存しています。Book オブジェクトをランダム アクセス ファイルに書き込む writeToFile メソッドがあります。LibraryBook クラスのメソッド writeToFile が super.writeToFile を呼び出してから、LibraryBook に固有のフィールドをファイルに書き込むようにします。これを行う適切な方法は何ですか?コードを参照してください:

book クラスのメソッド:

public void writeToFile(String fileName, long location) throws Exception {
    try {
        RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");
        // seek to correct record in file
        invFile.seek(location);
        // now write out the record
        // write out the data in fixed length fields
        // String fields must be truncated if too large
        // or padded with blanks if too small
                       //write out all Book variable to file
        invFile.writeLong(ISBN);
        //etc.....          

    } catch (FileNotFoundException notFound) {
        throw new FileNotFoundException();
    } catch (IOException io) {
        throw io;
    }
}

Book を拡張する LibraryBook クラスのメソッド:

    public void writeToFile(String fileName, long location) throws Exception {
    try {
        super.writeToFile(fileName, location);
        RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");

        // seek to correct record in file
        invFile.seek(location);
        // now write out the record
        // write out the data in fixed length fields
        // String fields must be truncated if too large
        // or padded with blanks if too small
                       //write library book variables to file
        invFile.writeLong(branchID);
                        //etc....

                    invFile.close();
    } catch (FileNotFoundException notFound) {
        throw new FileNotFoundException();
    } catch (IOException io) {
        throw io;
    }
}

LibraryBook の writeToFile メソッドがスーパークラス メソッドを呼び出して LibraryBook をファイルに保存できるようにコーディングするにはどうすればよいですか?

4

2 に答える 2

0

あなたがしていることは、本質的にレコードをファイルに保存することです。構造化データをファイルに保存するためにすでに利用可能な多くのメカニズムがあります。学習のためにこれを行うことに興味がある場合は、ぜひ続けてください。ただし、この問題を解決したいだけの場合は、SQLite3などを使用してストレージを提供することを検討してください。

このアプローチを続行する場合は、各メソッドが使用するサイズを決定し、更新する各メソッドにファイルの一部を割り当て、各メソッドがファイルのどこにあるかを正確に認識していることを確認する必要があります。その場所。

これが単なるCプログラムの場合は、各メソッドが担当するフィールド、#defineそれらのサイズ、および各メソッド#defineに追加するオフセットを数えることをお勧めしますlocation

しかし、それはあまり「Java」とは感じません。他のクラスの詳細を知らなくても、親や子を変更したり、新しいクラスを完全に追加したりできるはずです。

したがって、構造化データのファイルへの書き込みを1つのクラスに任せて、関連する各クラスにデータを照会することをお勧めします。各クラスに、書き込みbyteたいsの配列を返してもらい、1つのマスタークラスにすべての書き込みを実行させます。

すべてのファイルIOを1つのクラスに統合することで、後で別のストレージ形式に簡単に変更したり、プログラムの2つまたは3つの以前のバージョンとの互換性を維持したり、展開時のさまざまなニーズに合わせて複数のデータベースバックエンドを提供したりできます。

于 2011-11-24T01:35:56.770 に答える
0

メソッドをwriteToFile()最終的にします。

writeExtraData()次に、本の場合は何もしないが、クラスに余分なフィールドを書き込むためにオーバーライドされる保護されたメソッドを追加しますLibraryBookwriteToFile()のメソッドの途中からこれを呼び出しBookます。明らかに、読み取りメソッドの対称セットを実装する必要があります。

さらに良いことに、車輪の再発明や厄介な定型コードの記述をやめ、言語が提供する組み込みクラスObjectOutputStreamとクラスを使用して、この種のことを実行してください。ObjectInputStreamその後、あなたはただ行くことができますreadObject()

于 2011-11-24T01:36:38.650 に答える