Java: удалить файлы .lck и обеспечить запись файла - PullRequest
1 голос
/ 08 июня 2011

Моя программа (сервер) имеет регистратор, он является атрибутом класса основного сервера и используется всеми другими классами для регистрации ошибки.Есть ли способ удалить файлы .lck после завершения программы?Мой код:

private static Logger log = Logger.getLogger("ServerLog");

public Server() {
    // initialize variables
    try {
        FileHandler fh = new FileHandler(
                "src/main/resources/log/ServerLog.log", true);
        log.addHandler(fh);
        log.setLevel(Level.ALL);
        fh.setFormatter(new SimpleFormatter());
    } catch (SecurityException e) {
        getLog().log(Level.WARNING, e.getMessage());
    } catch (IOException e) {
        getLog().log(Level.WARNING, e.getMessage());
    }
}

И он вызывается другими классами для регистрации ошибок.

Второй вопрос: когда я пишу в файл, например:

public final void saveRanking() {
    try {
        FileOutputStream fos = new FileOutputStream(
                "src/main/resources/database/dataRanking.out");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(getRanking());
        oos.flush();
        oos.close();
        fos.close();
    } catch (FileNotFoundException e) {
        getLog().log(Level.SEVERE, e.getMessage());
    } catch (IOException e) {
        getLog().log(Level.SEVERE, e.getMessage());
    }
}

Есть ли способ гарантировать, что файл будет сохранен без проблем, даже если процесс завершается во время записи?

1 Ответ

0 голосов
/ 24 мая 2014

Если ваш код удаляет FileHandler при завершении работы, обязательно закройте FileHandler после его удаления.Вы должны ожидать увидеть файлы блокировки, когда FileHandler открыт.Если вы видите, что они задерживаются после выхода из виртуальной машины, то это потому, что FileHandler не был закрыт, виртуальная машина была остановлена ​​или аварийно завершена во время работы обработчика завершения работы обработчика или возникла исключительная ситуация ввода / вывода при попытке их удалить.

Возможно, вы работаете с Файл блокировки JDK-6774110 не удаляется, когда используется дочерний регистратор. Оценка не выполняется, но, думаю, это может произойти, когда регистратор собирается мусором.См. JDK-6274920: регистратор JDK содержит строгую ссылку на экземпляры java.util.logging.Logger.

...