0

我的程序的目标是让它在关闭时保存,并在打开时重新加载。

我有一个驱动程序(包含所有图形),我希望它创建和保存文件。我在互联网上看过很多教程,但他们没有解释的是如何在实际程序中正确实现这个系统。

我是否在我的主要方法中创建 OutputStrema?我是否需要检查是否已创建文件,如果未创建文件,是否需要从中读取?我如何完成这一切?我应该有一个用于退出的 WindowListener 以便它可以保存所有数据吗?

谢谢

4

2 回答 2

1

我是否在我的主要方法中创建 OutputStrema?

最好在保存状态的位置创建流。

当我的程序运行时,它将使用其 ObjectInputStream 接收保存的数据文件。我是否将完成此操作的代码放在我的 Main 方法中?

听起来是个不错的选择。基本上,您需要在尝试执行需要该数据的操作之前执行此操作。任何可以实现这一点的东西都可以工作(尽管使用静态初始化是一个坏主意......)

我是否需要检查是否已创建文件,如果未创建文件,是否需要从中读取?

这个问题使编写状态文件和阅读它感到困惑。它们发生在生命周期的不同点,并使用不同的代码来完成任务。

在创建一个保存文件之前检查是否存在是没有意义的......除非您建议重命名现有的保存文件。

相反,如果在启动应用程序时保存文件不存在,则尝试打开它的构造函数将抛出FileNotFoundException. 只需捕获异常并跳过读取已保存状态的代码。

...如果还没有创建文件,这会导致错误吗?

是的。一个 FileNotFoundException;看上面。所以你的代码必须处理这个问题,或者在尝试打开之前测试文件是否存在;见File.exists()及相关方法。

我应该有一个用于退出的 WindowListener 以便它可以保存所有数据吗?

这听起来像是解决方案的一部分。(但是程序崩溃或被杀死的情况呢?你想在这些情况下保存状态......还是不?)


有几点需要注意:

  • 许多与 GUI 相关的对象没有实现Serializable,因此无法使用ObjectOutputStream. 线程、流、套接字和其他一些东西也不能序列化。

  • 当您使用 保存类ObjectOutputStream的实例、更改类或其名称,然后尝试使用 重新加载它们ObjectInputStream时,您可能会遇到保存的实例与类的新版本不匹配的问题。如果您必须能够读取该序列化状态,那么您就有麻烦了。

于 2012-05-27T01:52:50.327 回答
1

是的,WindowListener 听起来是个好主意。保存程序状态的一种方法是使用Properties。请查看上面链接的教程。我不确定为您的“图形”推荐什么。请告诉我们更多关于您在这里的意思的详细信息。

编辑

我是否在我的主要方法中创建 OutputStrema?

您在 main 方法中创建 OutputStream 的问题是询问我们一无所知的程序结构。我的直觉告诉我,我不会在 main 方法中创建类似的东西,即使 JFrame 是在那里创建的(或在从 main 调用的静态方法中)。OutputStream 将在实现 WindowListener 的类中创建,这可以是它自己的独立类。您想让 main 方法尽可能小。

我是否需要检查是否已创建文件,如果未创建文件,是否需要从中读取?

可能。这个问题围绕着您将如何处理创建后的存储信息。也许您会在程序启动时搜索并阅读它?我不知道,因为这完全取决于您的需求,您必须弄清楚。

我如何完成这一切?我应该有一个用于退出的 WindowListener 以便它可以保存所有数据吗?

如果这是一个 Swing 应用程序,那么是的,WindowListener 将帮助您控制应用程序的关闭。

于 2012-05-27T00:46:33.630 回答