2

次のクラスファイルがあります。これにより、コマンド プロンプトが開始され、応答が出力されます。奇妙なことは、最初の印刷の後、つまり次のディレクトリが印刷されないことです。ご意見をお聞かせください。

import java.io.*;
public class JavaApplication14 {
static Process p;

public static void main(String[] args) {
    try {
        String line;

        p = Runtime.getRuntime().exec("cmd.exe");
        OutputStream stdin = p.getOutputStream();
        InputStream stderr = p.getErrorStream();
        InputStream stdout = p.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

        String input = "dir";
        input += "\n";
        writer.write(input);
        writer.flush();



        while ((line = reader.readLine()) != null) {
            System.out.println("Stdout: " + line);
        }
         input = "cd..";
        input += "\n";
        writer.write(input);
        writer.flush();
        input = "dir";
        input += "\n";
        writer.write(input);
        writer.close();

        while ((line = reader.readLine()) != null) {
            System.out.println("Stdout: " + line);
        }
    } catch (IOException ex) {
        Logger.getLogger(JavaApplication14.class.getName()).log(Level.SEVERE, null, ex);
    }
 }
 }
4

2 に答える 2

2

同期 I/O 操作を使用して、1 つのスレッドから基本的に非同期の作業を実行しようとしています。あなたのアプローチは必ず失敗します。

具体的にreadLine()は、読み取る行全体が存在するか、基になるストリームが閉じられるまでブロックします。

これを機能させるには、スレッドを含むかなり多くのコードを記述する必要があります。これは Java の問題点です。

サブプロセスにメイン プロセスの を継承させるために、 ProcessBuilder、特にredirectOutput引数 value を持つそのメソッドを使用することもできます。このシナリオでは、Java でサブプロセスの出力を分析する機会がありません。INHERITstdout

于 2013-06-24T11:25:48.017 に答える