据我了解,单例对象仅在应用程序即将终止时才会销毁。因此,在 C++ 中,我编写了一个 Singleton 类来记录我的应用程序,并在该 Singleton 记录器的析构函数中记录我的应用程序终止的时间。事情在 C++ 中完美运行。
现在我想在 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");
}
}