ObjectOutputStream 将数组写入具有继承 类 的文件而不是写入文件

ObjectOutputStream writing array to file with inherited classes not writing to file

我的任务是将员工列表保存为二进制文件(稍后从中读取)。我现在正在处理输出部分,下面是有问题的函数块。此函数确实有大约 10 行,但它们在 TextField arraylist 上编辑内容。

员工 class 是主管和秘书 class 的 parent。 all 是包含所有员工、秘书和员工 objects.

的 ArrayList

我使用的是 netbeans 8.0.2,当程序运行并单击 gui 中的保存按钮时(onActionEvent() 就是这个函数),没有编译器错误。 "IO Error" 或 "No Permissions..." 不输出。我尝试在已创建 employees.dat 文件的情况下进行保存。

我不太确定此时该做什么,我打算将每个 object 保存为 int、String 等的集合,但这很愚蠢,它应该能够以这种方式工作。 .. 对吗?

编辑: 员工、主管和秘书都是可序列化的。

private void saveChanges(ArrayList<Employee> all, ArrayList<TextField> text, int index) {


    try ( ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("employees.dat", true)); ) {

        for (int i = 0; i < all.size(); i++) {
            if (all.get(i).getClass() == (new Secretary().getClass()))
                output.writeObject(new Secretary((Secretary) all.get(i)));
            else if (all.get(i).getClass() == (new Supervisor().getClass()))
                output.writeObject(new Supervisor((Supervisor) all.get(i)));
            else
                output.writeObject(new Employee(all.get(i)));
        }

        output.flush();
    } catch (IOException io) {
        io.printStackTrace();
    } catch (SecurityException se) {
        se.printStackTrace();
    }
}

编辑:

我已将 try-catch 编辑为此代码...

try ( ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("employees.dat", true)); ) {

                output.writeObject(all);


        output.flush();
        output.close();
    } catch (IOException io) {
        io.printStackTrace();
    } catch (SecurityException se) {
        se.printStackTrace();
    }

仍然没有写入文件。我对 .java 文件所在的文件夹有权限。

您是否碰巧在没有适当权限的情况下编写了小程序或 JNLP?

您对输出文件的文件夹有写入权限吗? (在本例中是程序所在的目录 运行。)

我建议调用 io.printStackTrace() 和 se.printStackTrace();在异常处理程序中提供更多关于异常的信息。

在文件写入结束时也不要忘记调用 output.close() 以确保正确关闭流,写入数据的尾部并且没有剩余的打开文件句柄你的系统。

    try ( ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("employees.dat", true)); ) {

true 更改为 false,或将其删除。您不能附加到作为对象输出流创建的文件,至少不能像这样,而且您是否应该这样做还有待商榷。

        for (int i = 0; i < all.size(); i++) {
            if (all.get(i).getClass() == (new Secretary().getClass()))
                output.writeObject(new Secretary((Secretary) all.get(i)));
            else if (all.get(i).getClass() == (new Supervisor().getClass()))
                output.writeObject(new Supervisor((Supervisor) all.get(i)));
            else
                output.writeObject(new Employee(all.get(i)));
        }

把这整个烂摊子改成这样:

output.writeObject(all);

如果这仍然不起作用,那一定是某个地方出现了异常,您只需要找到它,打印它,然后 post 它。将其编辑到您的问题中。否则您正在查看错误的文件。

注意,您还必须更改读取文件的代码,以便在单个 readObject() 调用中读取列表。