2016-12-05 12 views
3

私は標準入力を消費したりSystem.in.available()を使用してSTDIN上の利用可能なデータがあるかどうかに応じて、標準出力に書き出しどちらかというJavaでコマンドラインユーティリティを書いている:STDIN入力可用性(競合状態?)

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

    // ... 
} 

私はSystem.in.available()チェックを使用して、コマンドラインパラメータを使用しないようにして、動作モードをシェルでどのように使用するか(つまり、java MyUtility | moreecho testing | java MyUtility)にします。

これまでのところ、これはMacのコマンドラインからうまく機能しています。 stdinの可用性は、常にSystem.in.available()が呼び出されるまでに存在していました。私の質問はされています、

java MyUtility < input.txt 

System.in.available()とユーティリティを呼び出す場合でも、ここに0を返すことがそれは可能だろうか?

もちろん、私はこれをすべてのJVM実装、シェル、およびOSで動作させたいと思います。 Windows、Mac、およびLinuxは、プロセスが生成されるまでに、標準のデータ可用性に対して異なる(何か)保証を提供しますか?そして、たとえOSがデータの可用性を保証しても、JVMはこのデータを保証するために何らかの発言をしていますか?シェル(つまり、ksh、csh、PowerShellなど)は役割を果たしますか?

答えて

0

プロセス間通信は、シェルとは独立して存在します。標準入出力と標準出力は、シェルが使用するオペレーティングシステムのメカニズムですが、作成しません。シェルではないプロセスは、それらを常に使用します。

available()メソッドの仕様については十分に分かっていませんが、Windowsでクイックチェックを実行して動作する場合は残りのOSはほとんどがUNIXスタイルですが、高い可能性がありますそれはどこでもうまくいくでしょう。