在我的理解中,一個單例對象只會在應用程序即將終止時才銷燬。所以在C++中,我編寫了一個Singleton類來記錄我的應用程序,並在該Singleton記錄器的析構函數中記錄了我的應用程序終止的時間。事情在C++中完美運行。Java:在finalize方法上寫文件
現在我想在Java中相同的記錄,因爲在Java中沒有析構函數,所以我實現了這個單記錄的finalize方法。但似乎finalize方法實際上永遠不會被調用。 因此,我添加了System.runFinalizersOnExit(true);
行,在我的代碼中的某處(儘管我知道它已被棄用),並且在應用程序終止前每次調用finalize方法。但仍然存在問題!如果我嘗試在finalize方法中寫入任何文件,它不起作用,儘管System.out的工作沒有任何問題! :(
你們可以幫助我在這個問題下面是什麼,我嘗試做一個示例代碼:
辛格爾頓記錄器類:
public class MyLogger {
FileWriter writer;
private MyLogger() {
try {
this.writer = new FileWriter("log.txt");
}
catch (IOException ex) {
}
}
public static MyLogger getInstance() {
return MyLoggerHolder.INSTANCE;
}
private static class MyLoggerHolder {
private static final MyLogger INSTANCE = new MyLogger();
}
@Override
protected void finalize() {
try {
super.finalize();
System.out.println("Here"); //worked correctly.
this.writer.write(new Date().toString()+System.getProperty("line.separator"));
this.writer.write("End");
this.writer.flush(); //does not work!
this.writer.close();
}
catch (Throwable ex) {
}
}
public synchronized void log(String str) {
try {
this.writer.write(new Date().toString()+System.getProperty("line.separator"));
this.writer.write(str+"\n");
this.writer.flush();
}
catch (IOException ex) {
}
}
}
主營:
public class Main {
public static void main(String[] args) {
System.runFinalizersOnExit(true);
MyLogger logger = MyLogger.getInstance();
logger.log("test");
}
}
看起來我有點慢。有人已經說過了.. – laher 2010-05-29 18:54:39
感謝:D 我只是把它做完,沒有任何定稿! 有人已經說過了,但你給了鏈接,這更有幫助。 感謝你和所有人:) – sowrov 2010-05-29 19:03:31