在Java控制台中检测Ctrl+C

问题描述 投票:0回答:1

我有一个Console-Java游戏。游戏中的分数将被保存在一个JSON文件中,如果 Ctrl+C 被按下。将分数保存在JSON文件中的过程是可行的。但是我不知道,如何检测到 Ctrl+C 如果发生这种情况,我将保存分数(只是一个方法调用)。KeyListener 它在控制台上不工作(只有在使用了 JFrame 据我所知)。)

我在网上找不到解决我问题的方法。

我必须用 运行时? 我已经试过了,但没有用...

Runtime.getRuntime().addShutdownHook(new Thread()
{
    public void run()
    {
        Test.mainThread.interrupt();
    }
});

在Stackoverflow上也有类似的问题,但不是在控制台使用的问题 在Java中捕获Ctrl+C

java command-line-interface control-c
1个回答
0
投票

增加一个关机钩子是正确的方法,但 Test.mainThread.interrupt(); 可能不会工作。 JVM已经在关闭了,你的mainThread不可能有时间响应一个中断。 你的mainThread不太可能有时间响应一个中断;一旦所有的shutdown hooks完成,Java就会终止。

只要让你的关机钩子显式地执行你需要采取的任何操作即可。

Runtime.getRuntime().addShutdownHook(new Thread()
{
    @Override
    public void run()
    {
        try
        {
            Test.saveScore();
        }
        catch (IOException e)
        {
            System.err.println("Couldn't save score before terminating.");
            e.printStackTrace();
        }
    }
});

0
投票

我们知道CTRL-C会关闭应用程序并关闭JVM。既然是正常的关机,那么它就会执行 关机钩. 所以创建一个关闭钩子是一个正确的方法。

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    // Do something to save the score 
}));

请注意,我们正在传递一个 Runnable 在这里作为关机任务。所以我们可以传递一个具有所需功能的对象。

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    gameScores.save(); // assuming we have a gameScores object in this scope
}));

你最初中断线程的尝试可以看作是这种方法的一个变体。我们可以不传递业务对象--gameScores,而是传递线程,以便以后中断它。但最好是在业务层面进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.