许多 Unix 程序(例如
mysql
和 expect
)能够直接向用户的 tty
发送消息,绕过重定向的 stdout 和 stderr 流。例如,mysql
可以打印密码提示,expect
有send_tty
。
Java 中有内置方法可以执行此操作,还是我手动打开
/dev/tty
并写入它的唯一选择?
我尝试使用 System.console() 方法,但是当标准流重定向时,console() 为 null。
这就是我目前正在使用的,这并不可怕,但肯定比
System.out.println()
更复杂。
try {
FileWriter tty = new FileWriter("/dev/tty", true);
tty.write("This will always appear in the tty.\n");
tty.flush();
tty.close();
} catch (Exception e) {}
在 Java 22 之前,没有标准/内置解决方案。
在 Java 22 中...来自 发行说明 ...
作为默认控制台提供程序 (JDK-8308591)JLine
在此版本中已更改为返回带有 增强的编辑功能可改善程序的体验 使用System.console()
API。此外,Console
现在返回一个System.console()
对象当标准流被重定向或连接时 到虚拟终端。 在之前的版本中,Console
返回System.console()
对于这些情况。此更改可能会影响使用 return 的代码 从null
测试虚拟机是否连接到终端。如果 需要,使用System.console()
运行将恢复旧版本 仅当连接到控制台时才返回控制台的行为 终端。-Djdk.console=java.base
添加了一个新方法
来测试控制台是否 连接到终端。Console.isTerminal()