0

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 が閉じられると、すべてが 1 つの大きなチャンクで送信されます。インデントの問題については申し訳ありません。Stackoverflow エディターは、すべてのコードを再配置しました。

4

2 に答える 2

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

このコードの問題は、プログラムが終了するまで実行し続けることです。lineStrプログラムが終了するまで(console.readLine()isの場合)にすべての行を追加しますnulllineStrその後、コンソール全体を含む全体が印刷されます。

出力を継続的に印刷したい場合は、すぐに印刷する必要があります。

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

これは 1 つの別のスレッドで実行でき、プログラムが終了するまでコンソールを出力ストリームに出力し続けます。

于 2013-07-18T16:59:07.410 に答える
0

ここには 2 つの可能性があるように思えます。

  • readLineブロックし、入力を待っています (null期待どおりに戻りません)。を使用せずBufferedReader、代わりに使用することで修正できる場合があります。InputStream

  • すべての入力が書き込まれるまで、出力ストリームはフラッシュされません。そこに入れてみてくださいflush

    また、 がの場合、現在のコードは (条件を交換する必要があります) と同じように取得されますlineStrが、 になることさえできないことに注意してください。nullNullPointerExceptionnull

    if (!lineStr.isEmpty())
    {
       netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr);
       netOut.flush();
    }
    
于 2013-07-18T16:07:41.917 に答える