【问题标题】:Java reading a vector of objects from a file only reads the first object in the vectorJava 从文件中读取对象向量仅读取向量中的第一个对象
【发布时间】:2012-10-05 19:43:45
【问题描述】:

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

    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;

}

【问题讨论】:

  • 在输出之前写出向量的长度,以确保它是您所期望的。还要写出计数。您使用的案例数量是多少?

标签: java vector io deserialization objectoutputstream


【解决方案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取决于你想要的结果。

【讨论】:

  • 我想将新的对象数据附加到已保存文件中的 Vector 中。
  • 因此,如果您只想这样做,请先检查文件是否存在。如果存在,则读入其中的向量。然后你可以随心所欲地操纵它。如果文件不存在,则创建一个新文件,然后在您完成修改矢量后将其再次写入文件。
  • 另外 - 当你将它写回文件时,你不应该追加它,你应该覆盖文件。
  • 我该如何实施您的建议?
  • 非常感谢@Chad Campbell,我听从了你的建议,结果达到了我的预期。
【解决方案2】:

您的代码对我来说运行良好,并且正在打印所有已注册的案例,除了我没有附加到已经创建的文件(这就是您想要的,对吗?)。几张支票-

  1. 类 Cases 是否实现了 java.io.Serializable?
  2. 字段的可见性如何?默认/私有?
  3. 我看到您没有关闭 FileOutputStream 和 FileInputStream,您这样做是有原因的吗?

【讨论】:

  • class Cases 正在实现 java.io.serializable,字段的可见性没有明确设置,我已经关闭了 FileOutputStream 和 FileInputStream 但最初的问题仍然存在。我开始认为问题出在附加到已创建的文件中。对此的任何见解都会非常有帮助。
  • 是的,这就是问题所在,你每次都想创建一个新文件,所以只需从 FileOutputStream 的构造函数中删除 append=true 即可。
  • 你是说没有办法将数据写入一个文件并按照我的意图读回?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多