我正在尝试将对象从Java应用程序保存到一个文件中,以便在应用程序关闭后使用。我知道您使用FileInputStream/ObjectInputStream从文件中读取对象,并使用FileOutputStream/ObjectOutputStream将对象写入文件。到目前为止,我能够成功地将对象保存到文件中,并在重新打开应用程序时将它们重新加载到应用程序中。然而,,我的问题是,这只工作一次.
我启动应用程序,输入数据并关闭应用程序。数据被写入指定的文件,当我重新打开应用程序时,数据被正确地重新加载到应用程序中,但是如果我添加了任何新的数据,它就不会在应用程序关闭时被写入指定的文件。然后,当我第二次重新打开应用程序时,没有数据被读取到应用程序中,使应用程序完全空白。
下面是我编写对象的代码:
static class quit_Action implements ActionListener
{
@Override
public void actionPerformed (ActionEvent e)
{
try
{
FileOutputStream savedData = new FileOutputStream("groupData.txt", false);
ObjectOutputStream save = new ObjectOutputStream(savedData);
save.writeObject(existingGroups);
save.writeObject(groupCombo);
save.writeObject(groupList);
System.out.println("Data Saved");
save.close();
System.out.println("savedData Closed");
}
catch(IOException ioe)
{
}
System.exit(0);
}
}第一次运行时,系统输出“数据保存”和"savedData关闭“,但第二次运行时,没有打印任何打印语句。通过故障排除,我确定了所有的代码
ObjectOutputStream save = new ObjectOutputStream(savedData);运行,但之后的任何行都不会发生,除非系统退出。
下面是我的对象读取的代码:
try
{
FileInputStream loadedData = new FileInputStream("groupData.txt");
ObjectInputStream load = new ObjectInputStream(loadedData);
existingGroups = (ArrayList<NewGroup>) load.readObject();
groupCombo = (DefaultComboBoxModel) load.readObject();
groupList = (DefaultListModel) load.readObject();
System.out.println("Data Loaded");
loadedData.close();
System.out.println("loadedData Closed");
}
catch(IOException ioe2)
{
}这与写入部分有相同的问题,因为“数据加载”和"loadedData关闭“是第一次打印,而不是第二次打印。代码可达
ObjectInputStream load = new ObjectInputStream(loadedData);运行,但在try语句中没有运行。
如果我删除文件groupData.txt并重新打开应用程序,我可以再次读写,但只能读一次。我尝试过使用File.delete()方法删除应用程序中的文件,但是即使应用程序通过了这一行代码,文件也不会自己删除。我在这里的想法是,我可以删除文件,然后直接创建一个相同名称的新文件,然后在关闭程序之前将对象写入新文件。这是行不通的。每次创建FileOutPutStream时,我都会尝试创建一个新文件
FileOutputStream out = new FileOutputStream(new File(groupData.txt), false);但这种做法也没有奏效。
我想,也许我可以想出一种方法,在每次打开应用程序时创建一个具有不同名称的文件,并使用它来创建我的流,但我不确定我将如何做到这一点,而且它还会用一堆无用的文件在任何目录中创建文件。
我的对象就是这样初始化的。
static DefaultListModel groupList = new DefaultListModel();
static DefaultComboBoxModel groupCombo = new DefaultComboBoxModel();
static ArrayList<NewGroup> existingGroups = new ArrayList<NewGroup>();我在网上查看过,但大多数情况下只能找到关于如何在应用程序中读写对象的教程,我已经知道了该如何做(虽然只有一次),这就是为什么我会请求帮助的原因。如果我已经问过这个问题--我很抱歉,我看了十几个问题,这些问题与这个具体的问题无关。
发布于 2017-03-31 16:52:42
不要使用FileOutputStream savedData = new FileOutputStream("groupData.txt", ***false***);,而是使用FileOutputStream savedData = new FileOutputStream("groupData.txt", ***true***);。第二个参数(当设置为true时)指示要向文件中添加数据。如果选择“false”,则在保存新数据之前删除现有数据。
发布于 2018-05-20 17:31:13
我去派对有点晚了,但为了将来的参考.
您打开savedData和save流,但只打开后者的close()。FileOutputStream保持打开状态,并阻止再次写入该文件的尝试。
故事的士气:永远使用try-with-resources.
https://stackoverflow.com/questions/43145419
复制相似问题