Java ObjectOutputStream建议

Java ObjectOutputStream建议,java,objectoutputstream,Java,Objectoutputstream,我的程序的目标是在关闭时保存,在打开时重新加载 我有一个驱动程序(包含所有的图形),我希望它创建并保存一个文件。我在互联网上看过很多教程,但它们没有解释如何在实际程序中正确实现这个系统 我是否在main方法中创建OutputStrema?我是否需要检查文件是否已创建,如果未创建,是否从中读取?我如何完成这一切?我应该有一个WindowListener用于退出,以便它可以保存所有数据吗 谢谢是的,WindowListener听起来是个好主意。保存程序状态的一种方法是使用。请看一下上面链接的教程。我

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

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

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


谢谢

是的,WindowListener听起来是个好主意。保存程序状态的一种方法是使用。请看一下上面链接的教程。我不知道该为你的“图形”推荐什么。请告诉我们更多关于你在这里的意思的细节

编辑

我是否在main方法中创建OutputStrema

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

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

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

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

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

我是否在main方法中创建OutputStrema

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

当我的程序运行时,它将接收保存的数据文件及其ObjectInputStream。我是否将实现这一点的代码放在我的主方法中

听起来是个不错的选择。基本上,在尝试做需要这些数据的事情之前,您需要这样做。任何实现这一点的方法都会起作用(尽管使用静态初始化是个坏主意…)

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

这个问题混淆了写状态文件和读状态文件。它们发生在生命周期中的不同点,并使用不同的代码来完成任务

在创建一个保存文件之前,没有必要检查它是否存在。。。除非您打算重命名现有的保存文件

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

。。。如果尚未创建文件,是否会导致错误

对。FileNotFoundException;见上文。因此,您的代码必须处理这个问题,或者在尝试在中打开之前测试文件是否存在;请参阅
File.exists()
和相关方法

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

这听起来是解决方案的一部分。(但是程序崩溃或被终止的情况又如何呢?在这些情况下,您想保存状态……还是不想?)


有几件事需要注意:

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

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


对于图形没有什么可推荐的吗?请看教程。@user1419623:您的问题在这一点上有点含糊不清,我很难提出任何建议。请再次澄清你的问题。你说的“图形”到底是什么意思?您的GUI中是否有要保存的图像?哦!很抱歉不,我在图形驱动程序中有一个需要保存的对象,而不是图形本身。我有一个StateManager对象。@user14:如果需要保存一个复杂的对象,那么可能需要某种序列化,可以是标准序列化,也可以是xml序列化。谢谢,main方法非常简单。我要尝试一些东西,我会让你知道它们的进展。谢谢你们的帮助,伙计们!为什么你认为创建流的方法很重要?这是说它不重要吗?1)如果创建了一个新文件,我如何让它不创建一个新文件2)我如何使它在窗口关闭时将对象保存到文件从应用程序的角度来看,无论是什么都很重要。将其作为所有应用程序的
main()
方法永远都不是正确的答案。好吧,我很抱歉假设您了解我项目的每一个细节。我确实有一个非常具体的想法,我想完成什么。所以这里是我的新问题:当我的程序运行时,它将接收保存的数据文件及其ObjectInputStream。我是否将实现这一点的代码放在我的主方法中?如果我这样做了,如果还没有创建文件,这会导致错误吗?