java - 有没有办法确定 Java System.in 是否为 "interactive"?

标签 java

如果输入是交互式的,即来自控制台,我想打印一个命令提示符,例如“>”

但是如果它被重定向,例如来自文件,那么我不想提示。

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

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

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

最佳答案

AFAIK,没有办法在纯 Java 中执行此操作,即使在 JNI/JNA 中执行也会很复杂。

替代方法可能是使用 JDK 1.6 中引入的新控制台 API。这允许您尝试为控制台获取读取器/写入器。如果成功,则保证结果是交互式的……就您的意思而言。

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


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

If System.out is redirected to a file I also do not want to prompt.

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

备选方案包括:

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

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

关于java - 有没有办法确定 Java System.in 是否为 "interactive"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413552/

相关文章:

java - 如何在 GWT 中检查 ROOTPanel 上当前添加的类

Java 泛型 - 类型参数 String 隐藏了 String 类型

java - 在没有用户输入的情况下调度 AWT 事件

java - 旧 Java 项目兼容性

java - 使用泛型类实现 Comparable

java - 从文本文件读取数据,比较行并以首选格式显示

java - 减少类型层次结构中的泛型变量的最佳实践?

java - 如何在 JPA 中对结果查询进行分页?

java - 如何在抽屉导航中添加菜单项运行时?

java - 如何使用itext在Jframe中打开pdf文件