从文件中读取对象向量的Java只读取向量中的第一个对象

时间:2012-10-15 19:05:32

标签: java vector io deserialization objectoutputstream

我有几个根据用户输入分配属性的对象。然后我将这些对象存储在一个向量中,然后将该向量写入文件,但在对存储的向量进行反序列化时,只读取第一个对象。这是我到目前为止的代码:

    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;

}

2 个答案:

答案 0 :(得分:1)

你的代码运行正常并打印所有注册的案例,除了我没有附加到已创建的文件(这就是你想要的,对吧?)。几个支票 -

  1. 类实例是java.io.Serializable吗?
  2. 田地的可见度是多少?默认/私有?
  3. 我看到你没有关闭FileOutputStream和FileInputStream,你有没有理由这样做?

答案 1 :(得分: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标志时,这将导致你每次添加一个新的向量而不是仅覆盖当前向量新的,正确的。

<强> ORIGINAL

问题在于您的实现是每次写入保存文件时都要附加一个新数组。因此,每当您尝试从文件中读取时,您总是会获得您制作的第一个数组。

我不确定你是否只想每次都用新的数据覆盖数组,但你应该在添加更多的情况之前读入当前数组,或者不要为FileWriter构造函数将append标志设置为true取决于您想要的结果。