在我的理解中,一个单例对象只会在应用程序即将终止时才销毁。所以在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