我正在用Java编写一个命令行实用程序,根据stdin中是否有数据可用,它可以消耗stdin或写入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 | more
与echo testing | java MyUtility
)。到目前为止,这在Mac命令行上运作良好; 在调用
System.in.available()
时,stdin可用性始终存在。我的问题是:即使使用下面的命令调用该实用程序,是否仍然可能存在没有stdin可用的情况?java MyUtility < input.txt
System.in.available()
这里可能会返回0吗?
当然,我希望这适用于所有JVM实现、 shell 和操作系统。Windows、Mac和Linux在进程生成时是否提供不同(任何)有关stdin数据可用性的保证?即使操作系统保证了数据可用性,JVM是否也有保证此数据的说法?shell(即ksh、csh、PowerShell等)是否起到作用?