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

时间:2013-08-22 15:05:29

标签: java

我正在编写一个包含多个线程的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()命令时会挂起。

4 个答案:

答案 0 :(得分:0)

我猜测读者阻止等待输入你可能能够从命令行输入你的输入

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

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

答案 3 :(得分:0)

尝试使用.ready()函数。

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

对stdout执行相同的操作。