ObjectOutputStream将数组写入文件,其中继承的类不写入文件

时间:2015-01-27 04:06:00

标签: java inheritance arraylist output objectoutputstream

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

Employee类是Supervisor和Secretary类的父级。 all是包含所有员工,秘书和员工对象的ArrayList。

我正在使用netbeans 8.0.2,当程序运行时我单击gui中的save按钮(onActionEvent()就是这个函数)没有编译器错误。 " IO错误"或"没有权限......"没有输出。我已尝试使用和不创建employees.dat文件来保存它们。

我现在还不确定要做什么,我打算将每个对象保存为int,String等的集合,但是这很愚蠢,它应该能够以这种方式工作。 ..对吧?

编辑: 员工,主管和秘书都是Serializable。

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文件所在的文件夹中拥有权限。

2 个答案:

答案 0 :(得分:0)

你有没有机会在没有适当权限的情况下编写applet或JNLP?

您是否具有输出文件的文件夹的写入权限? (在这种情况下是运行程序的目录。)

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

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

答案 1 :(得分:0)

    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);

如果这仍然不起作用,某处必定存在异常,您只需要找到它,打印并发布即可。将其编辑到您的问题中。或者你正在查看错误的文件。

注意,您还必须更改读取文件的代码,只需在readObject()次调用中阅读该列表。