1

ユーザー入力に基づいて属性が割り当てられたオブジェクトがいくつかあります。次に、これらのオブジェクトをベクターに保存し、そのベクターをファイルに書き込みますが、保存されたベクターを逆シリアル化すると、最初のオブジェクトのみが読み取られます。これが私がこれまでに持っているコードです:

    public Vector<Cases> registerCase() {
    Vector<Cases> casesVector = new Vector<Cases>(10, 2);
    Scanner myCase = new Scanner(System.in);
    Scanner userChoice = new Scanner(System.in);
    System.out.println("HOW MANY CASES DO YOU WANT TO REGISTER?");
    int count = userChoice.nextInt();
    for (int i = 0; i < count; i++) {
        Cases newCase = new Cases();

        System.out.println("Enter the case name: ");
        newCase.caseName = myCase.nextLine();

        System.out.println("Enter the client's name: ");
        newCase.client = myCase.nextLine();

        System.out.println("Enter the case type: ");
        newCase.caseType = myCase.nextLine();

        if((newCase.caseType.equals("Major")) || newCase.caseType.equals("major")){
            newCase.closedCaseRevenue = majorCasePrice;
        }else {
            newCase.closedCaseRevenue = (int) (0.75 * majorCasePrice);
        }

        casesVector.add(newCase);
    }

    try{
        // Open a file to write to, named SavedCases.sav.
        FileOutputStream saveFile = new FileOutputStream("SavedCases.sav", true);
        ObjectOutputStream save = new ObjectOutputStream(saveFile);
        save.writeObject(casesVector);
        save.close(); 
    }
    catch(Exception exc){
        exc.printStackTrace(); 
    }

    Vector<Cases> comVector = new Vector<Cases>();
    try{
        FileInputStream saveFile = new FileInputStream("SavedCases.sav");
        ObjectInputStream save = new ObjectInputStream(saveFile);
        comVector = (Vector<Cases>) save.readObject();
        System.out.println("The size of the vector is: " + comVector.size());
        save.close(); // This also closes saveFile.
    }
    catch(Exception exc){
        exc.printStackTrace(); 
    }

    for (Cases law_case : comVector) {
        System.out.println("Name: " + law_case.caseName);
        System.out.println("Client: " + law_case.client);
        System.out.println("Case Type: " + law_case.caseType);
        System.out.println("Case State: " + law_case.caseState);
        System.out.println("Case Revenue: " + law_case.closedCaseRevenue);
        System.out.println();

    }

    return casesVector;

}
4

2 に答える 2

1

あなたのコードは私にとっては問題なく実行されており、既に作成されたファイルに追加していないことを除いて、登録されているすべてのケースを出力しています(それはあなたが望むものですよね?)。いくつかのチェック-

  1. クラス Cases は java.io.Serializable を実装していますか?
  2. フィールドの可視性は?デフォルト/プライベート?
  3. FileOutputStream と FileInputStream を閉じていないようですが、そうしている理由はありますか?
于 2012-10-15T19:39:41.497 に答える
1

編集:ベクトルが既に存在する場合に追加するには...

を使用して既存のファイルを確認します

File f = new File(FileName);
if(f.exists()) 
  /* Read in the vector from the file using an object input stream on the file */
else 
  /* make a new vector */

次に、入力を読み取ってそこにあるとおりに出力しますが、FileOutputStream に true フラグを含めないようにすると、現在のベクターを新しいベクターで上書きするのではなく、毎回新しいベクターを追加することになります。正しいもの。

オリジナル

実装の問題は、保存ファイルに書き込むたびに新しい配列を追加していることです。したがって、ファイルから読み取ろうとするときはいつでも、作成した最初の配列を取得することになります。

配列を毎回新しい配列で上書きするかどうかはわかりませんが、ケースを追加する前に現在の配列を読み込むか、必要に応じて FileWriter コンストラクターの追加フラグを true に設定しないでください。望ましい結果。

于 2012-10-15T19:53:58.303 に答える