在 Java 控制台中检测 Ctrl+C



我有一个控制台Java游戏。如果按下Ctrl+C,游戏的分数将保存在 JSON 文件中。将分数保存在 JSON 文件中的过程有效。但我不知道,如何从控制台检测Ctrl+C,如果发生这种情况,我将保存分数(只是一个方法调用(。 使用KeyListener,它不能在控制台上运行(据我所知,仅适用于JFrame(。

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

我必须使用运行时来执行此操作吗?我试过了,但没有用...

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

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

添加关机钩子是正确的方法,但Test.mainThread.interrupt();可能不起作用。 JVM已经关闭。 您的主线程不太可能有时间响应中断; 一旦所有关闭钩子完成,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();
}
}
});

我们知道 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。但最好在业务层面上运作。

相关内容

  • 没有找到相关文章

最新更新