我的任务是将员工列表保存为二进制文件(稍后从中读取)。我现在正在处理输出部分,下面是有问题的功能块。这个函数确实有大约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文件所在的文件夹中拥有权限。
答案 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()
次调用中阅读该列表。