控制台应用程序(例如Java)如何识别“标准输入”流的来源?

时间:2009-11-20 15:41:28

标签: command-line console keyboard pipe

如果我在linux命令行上运行'python',并且我没有提供任何命令行参数,程序会显示欢迎消息并等待用户输入。我假设在引擎盖下,程序将消息发送到“标准输出”流并对“标准输入”流执行阻塞读取。

但是,如果我通过管道来自另一个进程的输出来间接调用python(例如echo“hello”| python),则python不会输出该消息。不知何故,它可以区分原始场景(a),其中“标准输入”流由其他进程填充,(b)“标准输入”流从键盘填充。

这是如何实现的?我一直认为这个信息不适用于应用程序。 Java应用程序如何能够实现这种差异化?

1 个答案:

答案 0 :(得分:1)

的Python:

import os
import sys

if os.isatty(sys.stdin.fileno()):
    print "is a tty"
else:
    print "not a tty"

我不知道使用默认库的Java等价物; Jython似乎使用本机代码(jna-posix)。

更新 - 这里有两种可能性:

  • System.console()返回一个控制台对象(如果有);否则为null(请参阅herehere
  • System.out。available()如果没有立即可用的输入则返回0,这往往意味着stdin是一个终端(但并不总是 - 这是一个不太准确的测试)