标准input可用性(竞争条件?)

我在Java中编写一个命令行实用程序,它使用stdin或写入标准输出,具体取决于使用System.in.available()是否存在标准input上的数据:

 public class MyUtility { public static void main(String args[]) { if(System.in.available() > 0) consumeFromStdin(); else produceToStdout(); } // ... } 

我正在使用System.in.available()检查来避免使用命令行参数,以使操作模式依赖于它在shell中的使用方式(例如, java MyUtility | more vs. 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等)是否起作用?

进程间通信独立于shell而存在。 标准输入和标准输出是外壳使用的操作系统机制,但不创建。 非shell的进程始终使用它们。

我不太了解available()方法的规范,但是如果你在Windows上执行一个快速检查并且它可以工作,其余的操作系统大部分是UNIX风格的,我认为很可能将无处不在。