-10

フィードバックを受け取った後、プログラムを実行しましたが、コンソールに出力がありません

import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.io.InputStream;

class pbdemo {

    static public void main(String[] args) throws Exception {
        String s;
        ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/f", "dir");
        pb.directory(new File("C:\\ljava"));
        try {
            Process pro = pb.start();
            pro.waitFor();
            BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));

            while ((s = br.readLine()) != null) {
                System.out.println("here we go" + s);
            }


        } catch (Exception e) {
            System.out.println("sorry" + e);
        }
    }
}

プログラムは実行されますが、何も出力されません。

4

3 に答える 3

1

/FフラグCMDはファイル完了用です。/Cフラグにコマンドを実行させたいと想定するのはおそらく安全です。/Cフラグがないと、cmd.exeはインタラクティブに実行され、入力を探します。プログラムはで無期限にブロックされwaitForます。交換:

new ProcessBuilder("cmd.exe", "/f", "dir");

new ProcessBuilder("cmd.exe", "/c", "dir");
于 2013-03-08T03:15:28.070 に答える
1

プロセスが終了するのを待ってから、その出力を読み取ろうとします。ただし、OSがすべてをバッファリングできないため、読み取りを開始するまで、すべての出力の書き込みを完了する可能性があります。最終結果、デッドロック。

pro.waitFor()すべての出力を読み取った後に呼び出しが発生するようにコードを変更します。

(「エラー」ストリームに何かが書き込まれる可能性もあります。ただし、dirコマンドで深刻な異常が発生しない限り、デッドロックを引き起こすのに十分なエラー出力が生成される可能性は低いです。したがって、おそらく問題ありません。現在行っているように、(仮想の)エラー出力は無視してください。)

于 2013-03-08T03:15:59.617 に答える
1

pro.waitFor();ブロッキング方法です。プロセスが終了するまで待機してから戻ります。これに関する問題は、多くのプログラムが標準出力バッファが読み取られる/クリアされるまで終了しないことです。つまり、あなたの場合、おそらく終了しないでしょう。

代わりにこのようなことを試してください...

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class PBDemo {

    public static void main(String[] args) throws Exception {
        String s;
        ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
        pb.directory(new File("C:\\ljava"));
        pb.redirectError();
        try {
            Process pro = pb.start();
            InputConsumer ic = new InputConsumer(pro.getInputStream());
            System.out.println("...Waiting");
            int exitCode = pro.waitFor();

            ic.join();

            System.out.println("Process exited with " + exitCode);

        } catch (Exception e) {
            System.out.println("sorry" + e);
        }
    }

    public static class InputConsumer extends Thread {

        private InputStream is;

        public InputConsumer(InputStream is) {
            this.is = is;
            start();
        }

        @Override
        public void run() {
//            This is acutally a bad idea, not all process will write a new line ;)
//            BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));

            try {
                int in = -1;
                while ((in = is.read()) != -1) {
                    System.out.print((char) in);
                }
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

    }

}
于 2013-03-08T03:19:02.023 に答える