1

だからここに私の問題があります: プロジェクトの場合、カスタム リンク リストを作成する必要がありました。これにより、ノードを追加し、シリアル化を使用してディスクに保存/ロードする必要がありました。問題を定義する前に、システムについていくつか説明します。

  • ノードデータとして機能する一般的な「顧客ファイル」があります
  • これは、リストの要素として機能するノード オブジェクトに格納されます。
  • 名前や電子メールアドレスなどの情報が保存される顧客ファイルクラスと、それぞれのさまざまな取得および設定メソッドがあります-これらは正常に機能します
  • データの取得と設定、およびそれぞれの次のメソッドを持つノード クラスがあり、次の項目はノード オブジェクトであり、リストの次の項目として機能します。
  • add、remove、modify、sort、search などのメソッドを持つ個別にリンクされたクラスがあります。これはカスタムメイドのクラスであり、JAVA の事前作成リストを実装していません。
  • 多くのテストがすべてのクラスで別々に行われ、一緒に使用されました-これらのメソッドは誰にでも使えます-それらは機能します
  • ユーザーとシステム間のメイン インターフェイスに使用されるメイン クラスがあります。これは CLI システム (コマンド ライン) です。
  • リストをファイルに保存する機能とファイルからリストをロードする機能(メインクラス)があり、各機能はシリアライゼーションまたはデシリアライゼーションを使用してディスクからリストを保存/ロードします
  • すべてのクラスはシリアライズ可能なインターフェースを実装します
  • メイン クラスには 'MAIN' メソッドがあり、これにより while ループが動作し、ユーザーが何らかの方法でリストを変更できるようになります (たとえば、レコードの追加、レコードの削除など...)。
  • リストはループの外側にロードされるため、ループが繰り返されるたびにリストがクリアされることはありません (同僚の間でよくある問題です)。
  • 私は同じ方法で文字列を別のファイルの場所に保存するシステムのパスワードを持っています。これは何週間も機能しています。パスワードはその場所に保存され、自由にアクセス、変更、削除できます。
  • これらのロード/保存メソッドには、例外をキャッチするための適切な try/catch メソッドがあります

問題は、プログラミング環境をロードしてリストを見たいと思うたびに、ファイルのリストが「空」で、最後に追加/削除したときのレコードが含まれていないことに気付くことです。

レコードを追加してリストを変更します - 他のクラスが機能するので簡単です - これらが追加されたら、リスト内のすべてのアイテムを表示するだけの print 関数を呼び出します。

ただし、環境を閉じるとそれらが失われ、環境を再度開いてリストをもう一度見ると、空です!

これらのクラスが保存されているフォルダーを見ると、プログラムを実行するたびに「シェル」が作成され、プログラムが閉じられる/終了するまでそこに残ることに気付きましたが、リンクされたリストを保存する必要がある「listData.ser」にはデータがありません。

同様に、パスワードファイルには正常に保存されたパスワードが含まれているため、コードが機能しない理由について少し混乱しています。

これが私の保存リスト方法です:

private static void saveListToFile(SinglyLinkedList lst) {
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("ListData.ser"));
        os.writeObject(lst);
        os.flush();
        os.close();
    } 

    catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    catch (IOException e) {
        e.printStackTrace();
    }
}

同様に、ロード リスト メソッドも似ていますが、オブジェクト入力ストリームとファイル入力ストリームを使用します。

助言がありますか?

PS 私のメインの while ループは 400 行を超えるコード長であるため、投稿できません。

更新 1. ロード リスト メソッドの逆シリアル化コード:

private static SinglyLinkedList loadListFromFile() {
    SinglyLinkedList lst = null;

    try {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("ListData.ser"));
        lst = (SinglyLinkedList) is.readObject();
        is.close();
    }

    catch(FileNotFoundException e) {
        e.printStackTrace();
    }

    catch(IOException e) {
        e.printStackTrace();
    }

    catch(ClassNotFoundException e) {
        e.printStackTrace();
    }

    return lst;
}

単一リンクリストクラス自体が問題だとは思いません(コメントへの応答)。また、300行を超えるコード(多くのメソッド)であるため、コピーすることはできません。

4

2 に答える 2

0

ファイル/オブジェクトの書き込みが完了したら、を呼び出しclose()てみましたか?FileOutputStream

于 2013-01-22T18:06:10.230 に答える
0

コードを投稿する代わりに、自分でやろうとして解決しました。リストクラスのいくつかの静的メソッドがあったことがわかりました-これらは非静的に変更され、リストは毎回期待どおりに保存されます。助けてくれてありがとう

于 2013-01-25T09:45:09.863 に答える