1

基本的にLinuxコマンドをJavaを介して送信し、出力を出力するプログラムを作成しています。出力が1行のみの場合は正常に機能しますが、複数行の出力の場合、何が間違っているのかわかりません。たとえば、メモリ使用量を確認するには、「free」コマンドを使用しますが、1 行目と 3 行目しか返されません。コードは次のとおりです。

if (clinetChoice.equals("3"))
    {
        String command = "free";

        Process process = Runtime.getRuntime().exec(command);

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        System.out.println("You Chose Option Three");

        String line;            

        while ((line = reader.readLine()) != null)
        {
            output += line;
            System.out.println(line);
            line = reader.readLine();
        }

    }

これを実行すると、次のものが返されます。

total  used  free  share  buffers  cached
-/+ buffers/cache:  6546546  65464645

クライアントコード:

while ((fromServer = input.readLine()) != null)
    {
        System.out.println("Server: " + fromServer);            
        if (fromServer.equals("Bye"))
            break;          

        System.out.print("Enter your choice: ");
        fromClient = stdIn.readLine().trim();

        if(fromClient.equals("1"))
        {
            System.out.println("Client: " + fromClient);
            output.println(fromClient);

        }
        if(fromClient.equals("2"))
        {
            System.out.println("Client: " + fromClient);
            output.println(fromClient);

        }
        if(fromClient.equals("3"))
        {
            System.out.println("Client: " + fromClient);
            output.println(fromClient);

        }
        if(fromClient.equals("4"))
        {
            System.out.println("Client: " + fromClient);
            output.println(fromClient);
            break;

        }


    }
4

3 に答える 3

6

readLineループ テストループの本体の両方で呼び出しています。したがって、ループの反復ごとにreadLineが 2 回呼び出され、結果の 1 つが破棄されます。出力も追加もされませんoutput。これは、説明した結果と一致します。

このループで十分です。

while ((line = reader.readLine()) != null)
{
    output += line + System.getProperty("line.separator");
    System.out.println(line);
}

出力全体を 1 回出力しようとしているだけで、出力を変数に収集しているので、ループoutputの外に移動できます。println

while ((line = reader.readLine()) != null)
{
    output += line + System.getProperty("line.separator");
}

System.out.println(output);
于 2012-09-10T17:30:48.197 に答える
1

単にこれを使用してください...あなたはreadLine()2回呼び出しています....

while ((line = reader.readLine()) != null)
        {

            System.out.println(line);

        }

データを出力変数に割り当てたい場合は、while ループ内でこれを行います。

output = output + line;

于 2012-09-10T17:32:02.870 に答える
1

コメントに加えて、それを指摘する必要があります。2 回使用readline()すると、厳密に stdout/stderr を同時に消費する必要があります。そうしないと、プロセスの出力を消費していないため、プロセスの出力をブロックするリスクがあります。詳細については、この SO の回答を参照してください。

于 2012-09-10T18:34:19.813 に答える