2016-12-05 29 views
3

我用Java編寫的命令行實用程序,要麼消耗標準輸入或輸出到stdout取決於是否使用System.in.available()有數據可在標準輸入:標準輸入輸入可用性(競爭條件?)

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

    // ... 
} 

我使用System.in.available()檢查來避免使用命令行參數,以使操作模式取決於它在shell中的使用方式(即java MyUtility | moreecho testing | java MyUtility)。

到目前爲止,這在Mac命令行中運行良好;在調用System.in.available()時,stdin的可用性一直存在。我的問題是:會不會是可能的,調用帶有

java MyUtility < input.txt 

System.in.available()實用程序,即使在這裏可能會返回0?

當然,我想這對所有的JVM實現,貝殼,和操作系統工作。 Windows,Mac和Linux在生成進程時,是否提供對stdin數據可用性的不同(任何?)保證?而且,即使操作系統保證數據可用性,JVM是否也有保證這些數據的發言權? shell(即ksh,csh,PowerShell等)是否起作用?

回答

0

進程間通信獨立於shell而存在。標準輸入和標準輸出是外殼使用但不創建的操作系統機制。非shell的進程始終使用它們。

對於available()方法的規範我還不太瞭解,但是如果您在Windows上執行快速檢查並且它可以正常工作,其餘的操作系統大部分都是UNIX樣式的,我認爲很有可能它會在任何地方工作。