Я пишу утилиту командной строки в 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 и т. Д.)?