2016-12-05 4 views
3

Я пишу утилиту командной строки в Java, которая либо потребляет или стандартного ввода, пишет в стандартный вывод в зависимости от того, есть ли данные доступны на стандартный ввод с помощью System.in.available():STDIN вход наличие (состояние гонки?)

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

    // ... 
} 

I используя параметр System.in.available(), чтобы избежать использования параметров командной строки, чтобы сделать режим работы зависимым от того, как он используется в оболочке (то есть java MyUtility | more против echo testing | java MyUtility).

До сих пор это хорошо работает из командной строки Mac; Доступность stdin всегда существовала к тому времени, когда вызывается System.in.available(). Мой вопрос: может быть возможно, что, даже при вызове утилиты с

java MyUtility < input.txt 

System.in.available() здесь может возвращать 0?

Конечно, мне бы хотелось, чтобы это работало для всех реализаций JVM, оболочек и ОС. Предоставляют ли Windows, Mac и Linux разные (какие-либо?) Гарантии на доступность данных stdin к тому времени, когда порождаются процессы? И даже если ОС гарантирует доступность данных, имеет ли JVM какое-либо мнение об обеспечении этих данных? В качестве роли играют оболочки (т. Е. Ksh, csh, PowerShell и т. Д.)?

ответ

0

Связь между процессами существует независимо от оболочки. Стандартные и стандартные - это механизмы операционной системы, которые использует оболочка, но не создает. Процессы, которые не являются оболочками, используют их все время.

Я не знаю достаточно о спецификации метода available(), но если вы выполняете быструю проверку на Windows, и это работает, остальные ОС, в основном, в стиле UNIX, есть, я думаю, высокая вероятность что он будет работать повсюду.

Смежные вопросы