我的程序的目标是在关闭时保存它,并在打开时重新加载。
我有一个驱动程序(包含所有图形),我希望它创建并保存文件。我在互联网上看过很多教程,但他们无法解释的是如何在实际程序中正确实现这个系统。
我在main方法中创建OutputStrema吗?我是否需要检查文件是否已创建,如果没有创建,是否从中读取?我如何完成所有这些?我应该有一个WindowListener用于退出,以便它可以保存所有数据吗?
由于
答案 0 :(得分:1)
是的,WindowListener听起来不错。保存程序状态的一种方法是使用Properties。请查看上面链接的教程。我不确定为你的“图形”推荐什么。请告诉我们更多有关您的意思的详细信息。
修改
我在main方法中创建OutputStrema吗?
你有问题在main方法中创建OutputStream是在询问我们一无所知的程序结构。我的直觉告诉我,我不会在main方法中创建这样的东西,即使在那里创建了JFrame(或者在从main调用的静态方法中)。 OutputStream将在实现WindowListener的类中创建,这可以是它自己的独立类。你想让主方法尽可能小。
我是否需要检查文件是否已创建,如果没有创建,是否已从中读取?
可能。这个问题围绕着您创建时存储信息的内容。也许你会搜索它并在程序启动时阅读它?我不知道这一切都取决于你的需求,你必须要弄清楚。
我如何完成所有这些?我应该有一个WindowListener用于退出,以便它可以保存所有数据吗?
如果这是一个Swing应用程序,那么是的,WindowListener将帮助您控制应用程序的关闭。
答案 1 :(得分:1)
我在main方法中创建OutputStrema吗?
最好在保存状态的位置创建流。
当我的程序运行时,它将使用其ObjectInputStream接收保存的数据文件。我是否在我的Main方法中使用代码完成此操作?
听起来是个不错的选择。基本上,在尝试执行需要该数据的操作之前,您需要执行此操作。实现这一目标的任何东西都可以工作(尽管使用静态初始化这样做是个坏主意......)
我是否需要检查文件是否已创建,如果没有创建,是否已从中读取?
这个问题令人困惑写状态文件和读取它。它们出现在生命周期的不同点,并使用不同的代码来完成任务。
在创建保存文件之前,没有必要检查是否存在保存文件...除非您建议重命名现有的保存文件。
相反,如果启动应用程序时不存在保存文件,则尝试打开它的构造函数将抛出FileNotFoundException
。只需捕获异常并跳过读取已保存状态的代码。
...如果还没有创建文件,会导致错误吗?
是。一个FileNotFoundException;往上看。所以你的代码必须处理它,或者在尝试打开之前测试文件是否存在;请参阅File.exists()
及相关方法。
我是否应该使用WindowListener进行退出,以便它可以保存所有数据?
这听起来像解决方案的一部分。 (但是程序崩溃或被杀的情况怎么样?你想在那些情况下保存状态......还是没有?)
要注意的几件事情:
许多与GUI相关的对象未实现Serializable
,因此无法使用ObjectOutputStream
进行保存。线程,流,套接字和其他一些东西也无法序列化。
使用ObjectOutputStream
保存类的实例时,更改类或其名称,然后尝试使用ObjectInputStream
重新加载它们,您可能会遇到已保存实例的问题而不是匹配新版本的类。如果您必须能够阅读该序列化状态,那么您将遇到麻烦。