繁体   English   中英

FileInputStream和FileOutputStream

[英]FileInputStream & FileOutputStream

我正在尝试将对象从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)
    {
    }

这与书写部分有相同的问题,因为第一次打印“ Data Loaded”和“ loadedData Closed”,但第二次不打印。 代码最多

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>();

我在网上看过,但大多数时候只能找到关于如何向应用程序写入对象或从应用程序读取对象的教程,尽管我已经找到了方法(尽管只有一次),这就是为什么我想寻求帮助的原因。 如果已经向我道歉,我仔细检查了十几个问题,这些问题与这个特定问题无关。

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

我参加聚会有点晚了,但也许以后可以参考...

您打开savedDatasave流,但仅close()后者。 FileOutputStream保持打开状态,并阻止您尝试再次写入该文件。

故事的士气:始终使用try-with-resources

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM