Java:在程序关闭之前,没有来自Process对象的输入

时间:2013-07-18 15:47:08

标签: java input process

我正在尝试从Java脚本启动的.exe进程的控制台获取输入。控制台窗口中没有任何内容,在程序终止之前,程序不会读取任何内容。

blServ = new ProcessBuilder(blPath + "Blockland.exe", "ptlaaxobimwroe", "-dedicated", "-port " + port, "-profilepath " + blPath.substring(0, blPath.length() - 1)).start();
System.out.println("Attempting to start server...\n" + blPath);
consoleIn = new BufferedReader(new InputStreamReader(blServ.getInputStream()));

'blServ'是一个Process对象。是的,该计划正在成功启动。

public void blStreamConsole() //called once every 500 milliseconds
{
    String lineStr = "";
    String line = "";
    int lines = 0;
    try
    {
        if (consoleIn != null)
        {
            while ((line = consoleIn.readLine()) != null)
            {
                //if (!line.equals("%"));
                //{
                    lineStr += line + wordSym;
                    lines++;
                //}
            }
        }
    }
    catch (IOException e)
    {
        netOut.println("notify" + wordSym + "ERROR: An I/O exception occured when trying to get data from the remote console. Some lines may not be displayed.");
    }
    if (!lineStr.equals("") && !(lineStr == null))
        netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr);
}

基本上,这个方法看到在consoleIn对象中是否有更多的输入等待,如果有,它会将它拥有的每一行附加到另一个字符串,并将其他字符串发送到客户端。不幸的是,当Blockland.exe关闭时,它都是在一个大块中发送的。对于缩进问题,我们深表歉意。 Stackoverflow编辑器重新安排了所有代码。

2 个答案:

答案 0 :(得分:0)

在我看来,这里有两种可能性:

  • readLine阻止,等待输入(并且不会按预期返回null)。您可以使用BufferedReader代替using the InputStream

  • 来解决问题
  • 在写入所有输入之前,输出流不会刷新。尝试将flush放在那里:

    另请注意,如果lineStrnull,您将获得NullPointerException作为您当前的代码(您需要更换条件),但它甚至不能null

    if (!lineStr.isEmpty())
    {
       netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr);
       netOut.flush();
    }
    

答案 1 :(得分:0)

while ((line = consoleIn.readLine()) != null){
     lineStr += line + wordSym;
     lines++;
}

这段代码的问题在于它会一直运行直到程序退出。它会将每一行追加到lineStr,直到程序退出(console.readLine()null时)。然后打印整个lineStr,包含整个控制台。

如果要连续打印输出,则需要立即打印:

while ((line = consoleIn.readLine()) != null){
     netOut.println(line);
}

您可以在一个单独的线程中运行它,它将继续将控制台输出到输出流,直到程序退出。