簡體   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