【问题标题】:Java: No input from Process object until the program closesJava:在程序关闭之前没有来自 Process 对象的输入
【发布时间】:2013-12-09 15:43:58
【问题描述】:

我正在尝试从由 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' 是一个进程对象。是的,程序正在成功启动。

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 编辑器重新排列了所有代码。

【问题讨论】:

    标签: java input process


    【解决方案1】:

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

    • readLine 阻塞,等待输入(并且不会像您期望的那样返回 null)。您也许可以通过不使用BufferedReader 而是使用using the InputStream

    • 来修复它
    • 在写入所有输入之前,输出流不会刷新。尝试将flush 放在那里:

      另请注意,如果lineStr 是null,您将得到一个NullPointerException,就像您的代码当前一样(您需要交换条件),但它甚至不能是null。

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

    【讨论】:

      【解决方案2】:
      while ((line = consoleIn.readLine()) != null){
           lineStr += line + wordSym;
           lines++;
      }
      

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2018-09-07
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        相关资源
        最近更新 更多