Java 从文件中读取对象 vector 仅读取 vector 中的第一个对象

标签 java vector io deserialization objectoutputstream

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

    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;

}

最佳答案

编辑:因此要附加到 vector (如果它已经存在)...

使用检查现有文件

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 标志时,这将导致您每次添加一个新 vector ,而不是仅使用覆盖当前 vector 新的、正确的。

原版

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

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

关于Java 从文件中读取对象 vector 仅读取 vector 中的第一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902317/

相关文章:

java - 在客户端服务器模型之间使用公钥和私钥加密是否明智?

Java - 向 JFrame 添加组件

java - 如何在 JPanel 和 JFrame 的 contentPane 之间添加间距?

c++ - 在 C++ 中对类的 vector 进行排序

java - 格式化输出文件的问题

C - 从命令行读入的问题 - 赋值使指针来自整数而不进行强制转换

python - 是换行符 "\n"2个字符还是1个字符

java - 通过 ResultSet 的 next() 方法避免跳过一行

c++ - 尝试调用 at() 时出现 C++ 中的 vector 错误

c++ - C++ Eclipse (Linux-Mint12) 中的转换问题