Обновлять только новый контент в файле все пять минут

Я получаю файл 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 в файле. Поэтому я не могу просто добавить новый контент...


person Michael Schmidt    schedule 08.10.2012    source источник
comment
System.err.println("Error in FileWrite: " + e.getMessage()); - это приведет к потере трассировки стека, и ваша программа не должна работать. Лучше перекинуть как RuntimeException.   -  person artbristol    schedule 08.10.2012
comment
@artbristol: спасибо, но сначала я хочу запустить код, а потом поймать ошибки...   -  person Michael Schmidt    schedule 08.10.2012
comment
@dTDesing да, но ваш код будет сложнее выявлять ошибки во время отладки.   -  person artbristol    schedule 08.10.2012
comment
@dTDesign: Насколько велик файл? Это МБ или несколько КБ? Также изменения только в Bigining/End или где-то еще? Каков формат файла?   -  person Pushkar    schedule 08.10.2012
comment
@artbristol: хм. ты прав :) я обновлю   -  person Michael Schmidt    schedule 08.10.2012


Ответы (3)


Во-первых, HashMap не совсем подходящий выбор. Он предназначен для использования в памяти, а не для сериализации (хотя, конечно, его можно сериализовать стандартным способом). Но если это всего лишь 2кб, то пишите все целиком, а не обновленные данные.

Во-вторых, вы, кажется, слишком беспокоитесь о производительности этого довольно тривиального метода (для 2 КБ запись займет считанные миллисекунды). Я бы больше беспокоился о проблемах согласованности и параллелизма. Я предлагаю вам изучить использование облегченной базы данных, такой как JavaDB или h2.

person artbristol    schedule 08.10.2012
comment
+1 за этот отличный ответ. Но с HashMap легко работать. Как мне сохранить карту, чтобы использовать ее снова? Я не уверен, что файл со временем станет таким маленьким... - person Michael Schmidt; 08.10.2012
comment
@dTDesign Просто напишите все еще раз. Не беспокойтесь о производительности, пока она вам не понадобится. Протестируйте свою программу на больших объемах данных и посмотрите, что произойдет. - person artbristol; 08.10.2012
comment
хорошо спасибо. я так делаю. но для эффекта обучения я также хочу попробовать другую версию, когда у меня будет на это время. я принимаю ответ. Как только я нашел решение для своего метода, я опубликую его в своем ответе. Спасибо за помощь! - person Michael Schmidt; 08.10.2012

Используйте конструктор FileOutputStream(File file, boolean append), установите boolean append в true. Он добавит текст в существующий файл.

person Pr38y    schedule 08.10.2012
comment
я не думаю, что добавление - правильный метод. Взгляните на мой РЕДАКТИРОВАТЬ. - person Michael Schmidt; 08.10.2012
comment
Вы можете использовать два варианта: один — установить append false, чтобы изменения были перезаписаны. Другой вариант: если файл уже существует, прочитайте содержимое, проанализируйте его как String или используйте Regex, чем замените изменения. - person Pr38y; 08.10.2012

Вы можете вызвать метод updateFile в цикле, а затем вызвать sleep на 5 минут (5*60*1000 мс).

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

Чтобы добавить к уже существующему файлу, вы можете использовать:

FileOutputStream fooStream = new FileOutputStream(file, true);
person Unni Kris    schedule 08.10.2012
comment
да нашел уже, но спасибо. Большой вопрос - обновление файла... - person Michael Schmidt; 08.10.2012
comment
Если вы просто добавляете в конец контента, то добавление всегда будет лучшим вариантом. - person Unni Kris; 08.10.2012
comment
Тогда лучше перезаписать. См. этот вопрос: stackoverflow.com/questions/11253843/ - person Unni Kris; 08.10.2012