java - 我正在尝试将文本从控制台记录到文本文件,但未创建文本文件

标签 java logging java.util.scanner java.util.logging

这是我的代码,我想知道为什么它没有记录任何内容。当我在控制台中输入时,它显示:

你好

2013 年 4 月 8 日 10:13:47 PM java.util.logging.LogManager$RootLogger 日志

信息:你好

但是,没有任何内容被记录到任何文件中。

import java.io.IOException;
import java.util.Scanner;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class main {
    public static void main(String[] args) throws IOException{

        while (1 == 1) {
            String text;
            Scanner in = new Scanner(System.in);
            text = in.nextLine();
            FileHandler fileTxt;
            SimpleFormatter formatterTxt;
            Logger logger = Logger.getLogger("");
            logger.setLevel(Level.INFO);
            fileTxt = new FileHandler("../loggedText.txt");
            formatterTxt = new SimpleFormatter();
            fileTxt.setFormatter(formatterTxt);
            logger.addHandler(fileTxt);
            logger.info(text);
        }
    }
}

最佳答案

您的循环永远不会终止,这意味着 JVM 永远不会执行正确的关闭。仅当所有日志记录关闭 Hook 正常执行时,FileHandler 才会关闭并同步。数据可能已写入但从未写入synched with the filesystem .

让我们创建一个可以正常终止的更正示例:

public class main {

    private static final Logger logger = Logger.getLogger(""); //Prevent G.C.

    public static void main(String[] args) throws IOException {
        logger.setLevel(Level.INFO);
        FileHandler fileTxt = new FileHandler("../loggedText.txt");
        fileTxt.setFormatter(new SimpleFormatter());
        logger.addHandler(fileTxt);

        System.out.println("root.level " + logger.getLevel());
        System.out.println("FileHandler.level " + fileTxt.getLevel());
        Scanner in = new Scanner(System.in);
        String text;
        while (true) {
            System.out.print("Enter text: ");
            text = in.nextLine();
            if (text != null && !text.isEmpty() 
                    && !"quit".equalsIgnoreCase(text)) {
                logger.info(text);
            } else {
                System.out.println("Done!");
                break;
            }
        }
    }
}

将向控制台输出以下内容:

root.level INFO
FileHandler.level ALL
Enter text: hello
Nov 22, 2016 10:39:19 AM java.util.logging.LogManager$RootLogger log
INFO: hello
Enter text: quit
Done!

文件系统上的 loggedText.txt 包含:

Nov 22, 2016 10:39:19 AM java.util.logging.LogManager$RootLogger log
INFO: hello

如果无法正常终止,则需要在您创建的处理程序上显式调用 FileHandler.close()

注意:记录的类名和方法名不正确,即 JDK-8152389 .

关于java - 我正在尝试将文本从控制台记录到文本文件,但未创建文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892193/

相关文章:

java - log4j2 设置 Async Logger 和 Async Appender 的线程数

java - 未关闭的扫描仪的垃圾收集

.net - 使用 EventSource 记录 ETW 丢失事件的风险

java - 从动态类引用动态 setter

java - 如何让我的程序停止接受输入并运行该程序?

java - 扫描仪拾取垃圾值?

java - 验证错误与验证错误

java - showOptionDialog 之后将焦点返回到 JTable 内的 JComboBox

java - KryoNet - 如何使用 Boolean xx = new clientprocess(); 启动客户端获得返回值?

java - 我的 hibernate 事务和 session 出了什么问题