我在Java中编写一个命令行实用程序,它使用stdin或写入stdout,具体取决于使用System.in.available()
在stdin上是否有可用的数据:
public class MyUtility {
public static void main(String args[]) {
if(System.in.available() > 0)
consumeFromStdin();
else
produceToStdout();
}
// ...
}
我使用System.in.available()
检查以避免使用命令行参数,使操作模式取决于它在shell中的使用方式(即java MyUtility | more
对比echo testing | java MyUtility
)。
到目前为止,这在Mac命令行中运行良好;在调用System.in.available()
时,stdin可用性始终存在。我的问题是:即使用
java MyUtility < input.txt
System.in.available()
这里可能会返回0?
当然,我希望这适用于所有JVM实现,shell和操作系统。 Windows,Mac和Linux是否在生成进程时提供了对stdin数据可用性的不同(任何?)保证?而且,即使操作系统保证数据可用性,JVM是否对保证这些数据有任何发言权? shell(即ksh,csh,PowerShell等)是否起作用?
答案 0 :(得分:1)
进程间通信独立于shell而存在。标准输入和标准输出是shell使用但不创建的操作系统机制。非shell的进程一直使用它们。
我对available()
方法的规范知之甚少,但是如果你对Windows进行快速检查并且它有效,那么其余的操作系统大多是UNIX风格的,我认为,它很可能在任何地方都有效。