【问题标题】:Update only the new content in a file all five minutes五分钟只更新文件中的新内容
【发布时间】:2012-10-08 17:44:25
【问题描述】:

我得到一个文件personHashMap.ser,里面有一个HashMap。这是我如何创建它的代码:

String file_path = ("//releasearea/ToolReleaseArea/user/personHashMap.ser");
public void createFile(Map<String, String> newContent) {
    try{
        File file = new File(file_path);

        FileOutputStream fos=new FileOutputStream(file);
        ObjectOutputStream oos=new ObjectOutputStream(fos);

        oos.writeObject(newContent);
        oos.flush();
        oos.close();
        fos.close();

    }catch (Exception e){
        System.err.println("Error in FileWrite: " + e.getMessage());
    }

}

现在我希望,当程序运行时,所有五分钟都更新文件personHashMap.ser 仅使用更改的内容。所以我调用的方法:

public void updateFile(Map<String, String> newContent) {
    Map<String, String> oldLdapContent = readFile();
    if(!oldLdapContent.equals(ldapContent)){ // they arent the same, 
                                             // so i must update the file

    }   

}

但现在我不知道如何实现这一点。
只更新新内容对性能更好还是应该清理整个文件并再次插入新列表?

希望你能帮助我..

编辑:

HashMap 包括 street=Example Street
但现在,这条新街叫New Example Street。现在我必须更新文件中的 HashMap。所以我不能只是追加新内容...

【问题讨论】:

  • System.err.println("Error in FileWrite: " + e.getMessage()); - 这将丢失堆栈跟踪,并且您的程序不应该真正进行。最好将其重新抛出为RuntimeException
  • @artbristol:谢谢,但首先我想运行代码,然后我会发现错误......
  • @dTDesing 是的,但是您的代码会使您在调试时更难捕获错误。
  • @dTDesign:文件有多大?是 MB 还是几 KB?也只在 Bigining/End 或任何地方进行更改?文件格式是什么?
  • @artbristol:嗯。你是对的:) 我会更新

标签: java file filereader


【解决方案1】:

首先HashMap 并不是一个合适的选择。它是为内存使用而设计的,而不是序列化(当然它可以以标准方式序列化)。但如果它只有 2kb,那就继续写整个东西而不是更新的数据。

其次,您似乎过于担心这种相当微不足道的方法的性能(对于 2kb,写入只需几毫秒)。我会更担心一致性和并发性问题。我建议您考虑使用轻量级数据库,例如 JavaDB 或 h2。

【讨论】:

  • +1 为这个很好的答案。但是使用 HashMap 很容易。我应该如何保存地图以再次使用它?我不确定随着时间的推移文件会这么小......
  • @dTDesign 再写一遍。在需要之前不要担心性能。用大量数据测试你的程序,看看会发生什么。
  • 好的,谢谢。我这样做。但是为了学习效果,我也想尝试其他版本,当我有时间的时候。我接受答案。一旦我找到了适合我的方法的解决方案,我就会将其发布在我的答案中。谢谢你的帮助!
【解决方案2】:

使用构造函数FileOutputStream(File file, boolean append),将boolean append设置为true。它会将文本附加到现有文件中。

【讨论】:

  • 我认为 append 不是正确的方法。看看我的编辑。
  • 您可以使用两个选项,一个是设置append false,以便覆盖更改。另一个选项是 - 如果文件已经存在,则读取内容将其解析为 String 或使用 Regex 而不是替换更改。
【解决方案3】:

您可以循环调用updateFile方法,然后调用sleep 5分钟(5*60*1000 ms)。

Thread.Sleep(300000); // sleep for 5 minutes

要附加到您已经存在的文件,您可以使用:

FileOutputStream fooStream = new FileOutputStream(file, true);

【讨论】:

  • 是的,已经找到了,但是谢谢。最大的问题是文件的更新......
  • 如果你只是添加到内容的末尾,那么追加永远是最好的选择..
  • 那么最好覆盖。看到这个问题:stackoverflow.com/questions/11253843/…
猜你喜欢
  • 2014-05-01
  • 2014-03-13
  • 2020-07-09
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多