Java FileInputStream和FileOutputStream

Java FileInputStream和FileOutputStream,java,fileinputstream,fileoutputstream,objectinputstream,objectoutputstream,Java,Fileinputstream,Fileoutputstream,Objectinputstream,Objectoutputstream,我试图将Java应用程序中的对象保存到文件中,以便在应用程序关闭后使用。我知道您使用FileInputStream/ObjectInputStream从文件中读取对象,并使用FileOutputStream/ObjectOutputStream将对象写入文件。到目前为止,我能够成功地将对象保存到文件中,并在重新打开应用程序时将其重新加载到应用程序中。然而,我的问题是,这只起作用一次 我启动应用程序,输入数据并关闭应用程序。数据会写入指定的文件,当我重新打开应用程序时,数据会正确地重新加载到应用程

我试图将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)
    {
    }
运行,但在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>();

我在网上查了一下,但基本上只能找到如何在应用程序中写入/读取对象的教程,我只知道如何写入/读取对象一次,这就是为什么我想寻求帮助。如果已经有人问过这个问题,我道歉,我看了十几个问题,这些问题与这个特定问题无关。

而不是FileOutputStream savedData=new FileOutputStreamgroupData.txt,***false***;,使用FileOutputStream savedData=new FileOutputStreamgroupData.txt,***真***;。第二个参数设置为true时,表示要向文件中添加数据。当您选择“false”时,现有数据将在保存新数据之前被擦除。

我参加聚会有点晚,但为了将来的参考,可能

可以打开savedData和save streams,但只能关闭后者。FileOutputStream保持打开状态并阻止您再次写入该文件的尝试


故事的寓意:始终使用try with resources。

您是否尝试打印IOException?默默地接受异常是一个重大错误。永远不要这样做。当我尝试打印堆栈跟踪时,我的IDE会给我一个警告,并说要删除它,这就是我没有打印的原因。我添加了打印堆栈跟踪并获得java.io.NotSerializableException:com.apple.laf.AquaPainter$AquaSingleImagePainter我知道这意味着序列化有问题,但是为什么它第一次工作而第二次不工作呢?这些对象实现了Serializable吗?我这样做是因为我想用更新的版本替换文件中的对象,而不是在文件末尾添加另一个副本。我只想要每个对象的一个版本。我也试过了,但还是有同样的问题。使用FileOutputStream,您必须读取文件中已保存的所有对象,并将它们保存回文件,只替换要更改的对象。工作,但可能会很耗时,因为您有许多对象。如果您有许多对象,则使用SQL数据库;如果只需要几个对象,则使用SharedReferences文件,但要以更复杂的保存过程为代价,这样会更好、更高效。
static DefaultListModel groupList = new DefaultListModel();
static DefaultComboBoxModel groupCombo = new DefaultComboBoxModel();
static ArrayList<NewGroup> existingGroups = new ArrayList<NewGroup>();