有没有办法确定Java System.in是否是"交互式的"?

And*_*lay 5 java

如果输入是交互式的,即从控制台输入,我想打印命令提示符,例如">"

但如果它被重定向,例如从文件中重定向,那么我不想提示.

System.in是一个抽象的InputStream,似乎没有任何方法.

如果具体类型不同,也许你可以使用instanceof?

同样,如果将System.out重定向到文件,我也不想提示

Ste*_*n C 5

AFAIK,在纯 Java 中没有办法做到这一点,甚至在 JNI / JNA 中做到这一点也会很复杂。

另一种方法可能是使用 JDK 1.6 中引入的新控制台 API。这允许您尝试获取控制台的读取器/写入器。如果成功,结果肯定是交互式的......就你的意思而言。

第二种选择是在用于启动应用程序的包装器脚本中执行“检查交互性”,并通过系统属性将信息传递给 Java。例如,在 GNU/Linux 系统上,该tty(1)命令可用于判断 stdin 是否连接到“tty”设备。


请注意,还有其他方法可以处理要求,以避免在非交互式运行时出现不需要的提示:

如果 System.out 被重定向到一个文件我也不想提示。

(我想你的意思可能System.in是重定向。这是非交互式运行应用程序的正常方式,该应用程序通常需要用户的交互式输入......)

替代方案包括:

  • 您可以修改程序以将提示写入(例如)System.err并将其重定向到不同的位置。

  • 您可以修改程序以具有表示“不提示”或“从文件获取输入”的选项。