2011-06-08 49 views
1

我的程序(服務器)有一個記錄器,它是主服務器類的一個屬性,它被所有其他類用來記錄錯誤。程序終止時是否有辦法刪除.lck文件?我的代碼:Java:刪除.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

我不確定我瞭解什麼創建了.lck。 – 2011-06-08 01:33:51

+1

* nix上的一個提示是,目錄創建是一個原子過程(即inode存在或不存在,通用),因此您使用鎖定目錄而不是鎖定文件,因爲它更安全。回答你的問題之一:使你的Logger類可以關閉,並在程序退出時將其關閉,就像main方法中的finally塊一樣,例如。沒有辦法確保程序中的任何內容,我們嘗試,抓住並最終確定。嘆。 – corlettk 2011-06-08 01:37:05

+0

在一個問題中不要問兩個不相關的問題。我建議您編輯問題以刪除第二個問題...併爲其創建一個新問題。 – 2011-06-08 04:58:14

回答

0

如果您的代碼在關閉時刪除FileHandler,請務必在刪除FileHandler後關閉它。您應該期望在FileHandler處於打開狀態時看到鎖定文件。如果你看到它們在虛擬機退出後徘徊不前,那是因爲FileHandler未關閉,虛擬機在處理程序關閉掛接運行時暫停或崩潰,或者在嘗試刪除它時發生I/O異常。

您可能會遇到JDK-6774110 lock file is not deleted when child logger is used.對此沒有評價,但是,我認爲這可能發生在記錄器被垃圾收集時。請參閱JDK-6274920: JDK logger holds strong reference to java.util.logging.Logger instances.