当进程在后台运行时,使用java.io.InputStreamReader读取标准输入会挂起



我正在编写一个具有多个线程的Java程序。其中一个线程负责从标准输入中读取行并对其进行解析。

正常运行时一切正常,但当程序在后台(在Linux中)运行时,使用:

$ java -jar my_jar_file &

我的程序挂起(至少在进入前台之前)。

当在后台运行时,我并不真正需要标准输入,但我也不希望我的程序挂起。

我寻找了一种方法来用程序确定进程是否在后台运行,但找不到

这是从标准输入读取的代码:

InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(inputStreamReader);
String line = null;
try {
  while ((line = br.readLine()) != null) {
    parseInputLine(line, br);
  }
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

据我所知,程序在到达br.readLine()命令时挂起。

我猜读卡器正在阻止等待输入,您可能可以从命令行导入输入

readLine是一个阻塞调用。因此,它显然在等待输入。如果你想让它在后台运行,那么把这样的文件中的输入传递给它

java TakeInput < test.txt &

这里的类如下所示,test.txt也如下所示:

public class TakeInput
{
    public static void main(String[] args)
    {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(inputStreamReader);
        String line = null;
        try {
          while ((line = br.readLine()) != null) {
              System.out.println(line);
          }
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
    }
}

写一个文本文件作为test.txt,上面写着

test1
test2
test3

我不相信Java程序能够确定它是在前台还是后台运行。

我尝试了System.console(),结果如下:

  • Linux-如果从文件重定向stdin,则返回null,与前台/后台状态无关
  • Windows——同样的东西
  • Cygwin-似乎总是返回null

我怀疑您需要从命令行调用程序作为

java -cp ... ClassName < /dev/null

尝试使用.ready()函数。

try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}

对stdout执行同样的操作。

最新更新