gpt4 book ai didi

java - 如何确保在销毁对象之前调用方法?

转载 作者:行者123 更新时间:2023-11-29 07:35:36 27 4
gpt4 key购买 nike

我编写了一个自定义日志记录类,其行为与 PrintWriter(如 System.out 或 System.err)非常相似。主要区别在于调用 myLogger.printf("Hello World!\n"); 时,数据不会直接写入日志文件,而是写入内部队列,而这队列仅通过 flush(); 方法刷新到输出文件。所以代码的使用看起来像这样:

myLogger.println("Line 1.");
myLogger.println("Line 3.");
myLogger.println("Actually that was Line 2. THIS is Line 3!");
myLogger.flush();

这应该给出(有点)看起来像这样的输出:

2016-03-30 15:44:45::389> Line 1.
2016-03-30 15:44:45::390> Line 3.
2016-03-30 15:44:45::395> Actually that was Line 2. THIS is Line 3!

但是,我遇到的问题是用户会犯错误。即,他们忘记调用 flush(),并且他们写入记录器的数据永远不会转储到文件中,并且程序在不刷新数据的情况下关闭。

我不能在每次调用后刷新,因为这首先会破坏编写此类的目的。让系统管理自动冲洗同样会弄巧成拙。

我的想法是在对象的 finalize() 方法中调用 flush(),但正如我从 several other articles 中读到的那样在这个网站上,不保证 finalize() 会被调用。

为了清楚起见,flush() 方法如下所示:

public void flush() {
open();
while(!unwrittenLogs.isEmpty()) {
String line = unwrittenLogs.poll();
log.print(line);
}
close();
}

private void open() {
if(log == null) {
try {
log = new PrintWriter(new FileOutputStream(logFile, true));
} catch (FileNotFoundException e) {
System.err.printf("Unable to open Log File.\n%s\n",e.getMessage());
e.printStackTrace(System.err);
}
}
}

private void close() {
if(log != null) {
log.close();
log = null;
}
}

那么确保在程序退出之前刷新记录器的最佳选择是什么?

最佳答案

把你的方法放到finalize方法中,像这样:

@Override protected void finalize() throws Throwable {
// TODO Auto-generated method stub
// do some crazy stuff here
super.finalize();
}

这是对象销毁的示例。

要在 JVM 关闭之前保存数据,请使用关闭 Hook :

public static void main(final String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override public void run() {
// TODO Auto-generated method stub
// do the other crazy stuff in here
super.run();
}
});
}

但两者都不会 100% 安全使用。1)您可以在没有运行所有终结器的情况下关闭 JVM2) 如果您通过任务管理器/kill 信号终止 JVM 进程,则不会触发关闭 Hook

关于java - 如何确保在销毁对象之前调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319571/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com