【问题标题】:Saving Objects to File without duplication将对象保存到文件而不重复
【发布时间】:2014-10-08 16:59:24
【问题描述】:

我在将对象保存到文本文件时遇到问题。

这是我的一段代码

if(action.equals("Save Person List"))
    {
        f1 = new File("PersonList.txt");
        if(f1.exists())
        {
            f1.delete();
            f1 = new File("PersonList.txt");
        }

        try {
            fWriter = new FileWriter(f1, true);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        pWriter = new PrintWriter(fWriter, true);

        for(Person p: pList)
        {
            pWriter.println(p.getFName());
            pWriter.println(p.getLName());
            pWriter.println(p.getPNo());
            pWriter.println(p.getSalary());
        }
        JOptionPane.showMessageDialog(null, "Person List Stored in File 'PersonList.txt'");
    }

在上面的代码中,单击按钮后,程序能够将对象的数组列表保存到文件中(我很高兴),但是假设我向数组列表中添加了更多对象,并且我想将它们保存到文件中,它会保存新数据,但在此过程中,它会复制文本文件中已保存的数据。

我希望程序能够覆盖文本文件中的数据并写入传入的新数据。我尝试删除文本文件(如果存在)但它不起作用。它显示在代码行中。有什么办法可以绕过这个障碍?

所有帮助将不胜感激!

【问题讨论】:

  • 您可以添加检查是否存在同名文件而不是删除它并创建新文件并将数据存储在其中。通过这样做,您将始终拥有没有重复的新数据。
  • @Ronnie7777:这就是他已经在做的事情了。而且完全没用。阅读我的答案。

标签: java file awt actionlistener


【解决方案1】:

发生这种情况的原因是,尽管您正在删除该文件(如果它已经存在),但删除可能会失败:您应该检查delete() 返回的值。重新创建File 对象也完全没用,顺便说一句。

它失败的第三个原因可能是因为您从未关闭文件的写入器,从而防止它被删除。您应该使用try-with-resources construct 来确保编写器在您完成后始终处于关闭状态。

最后,如果文件已存在,则无需删除该文件。只需以false 作为第二个参数打开一个 FileWriter,它不会追加到文件末尾,而是覆盖它。

【讨论】:

  • 感谢您的意见。除了我们犯错误
【解决方案2】:

通过使第二个参数为“true”,您将以追加模式打开文件,这意味着它将附加您写入文件末尾的任何内容。尝试在没有 append=true 的情况下创建 FileWriter,或显式设置 append=false,看看会发生什么。

http://docs.oracle.com/javase/7/docs/api/java/io/FileWriter.html

if(action.equals("Save Person List"))
    {
        f1 = new File("PersonList.txt");
        if(f1.exists())
        {
            f1.delete();
            f1 = new File("PersonList.txt");
        }

        try {
            fWriter = new FileWriter(f1, false);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        pWriter = new PrintWriter(fWriter, true);

        for(Person p: pList)
        {
            pWriter.println(p.getFName());
            pWriter.println(p.getLName());
            pWriter.println(p.getPNo());
            pWriter.println(p.getSalary());
        }
        JOptionPane.showMessageDialog(null, "Person List Stored in File 'PersonList.txt'");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2015-05-31
    • 2022-01-25
    相关资源
    最近更新 更多