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()
调用中读取列表。
我的任务是将员工列表保存为二进制文件(稍后从中读取)。我现在正在处理输出部分,下面是有问题的函数块。此函数确实有大约 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()
调用中读取列表。