Java:文件写入finalize方法

标签 java file

以我的理解,单例对象只会在应用程序即将终止时销毁。因此,在 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");
    }
}

最佳答案

这是其中一个奇怪的问题。注意:我不会编写自己的 Logging 类 - 看看 log4j 或其他东西......

如前所述,我真的不会真正使用 finalize。

...

从你所说的,你的目标只是在程序停止时运行一些东西。

我会注册一个 shutdownhook ...

shutdownhook 是一个用户定义的对象,它扩展了 Thread 类。例如你可以在记录器中定义一个静态内部类

这是一个例子:

http://www.crazysquirrel.com/computing/java/basics/java-shutdown-hooks.jspx

这是 API 文档: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

关于Java:文件写入finalize方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2936155/

相关文章:

java - 我正在尝试将我的应用程序从 Spring 转移到 Spring Boot,但遇到了一些问题。特别是以下异常

java - 设置有向无环图中节点的最晚开始时间

python - 使用OpenCV在python中水平组合两个图像

python - 将文件夹中的文件移动到顶级目录

java - 正则表达式字符集 [^\\w\\d\\s\\&] 不起作用

java - 我怎样才能修改mysql更新方法?

java - 在 RandomAccessFile 中插入数据并更新索引

Perl Excel 解析器截断列

c# - 如何使用 C# 从 Linux 机器读取不断增长的文件

c - strstr() 函数获取位置