25

Javaプロセスを開始するコードがあります(つまり、コンパイルされたJavaコードを実行します)

ProcessBuilder builder = new ProcessBuilder("java", "Sample", "arg1", "arg2");
builder.redirectErrorStream(true);
Process process = builder.start();

これにより、基本的に出力とエラーを処理できます

OutputStream stdin = process.getOutputStream(); // <- Eh?
InputStream stdout = process.getInputStream();

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

// reader.readLine() blah blah

では、入力を に送信するにはどうすればよいstdinですか? つまり、プロセスによって実行されるコードに、次のような入力を待機する行があるとします。

Scanner scan = new Scanner(System.in);
String val = scan.nextLine();
System.out.println(val);

私はこれを試しました:

writer.write("I'm from the stdin!.");
writer.flush();

何も起こらなかったのに。コンソールはまだ入力を待っていました。

何かご意見は?

編集:以下で受け入れられているように、質問に回答しました。欠陥のあるコードを表示するために編集しています(ところで、これを含めることができませんでした.Lol)。

パートの前にwriter.write()、私は

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

2 に答える 2

51

Process OutputStream私たちの観点から)は、プロセスの観点からのSTDINです

OutputStream stdin = process.getOutputStream(); // write to this

だからあなたが持っているものは正しいはずです。

マイ ドライバー (try-with-resources ステートメントを使用して独自のベスト プラクティスを適用します)

public class ProcessWriter {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder("java", "Test");
        builder.directory(new File("C:\\Users\\sotirios.delimanolis\\Downloads"));
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream(); // <- Eh?
        InputStream stdout = process.getInputStream();

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

        writer.write("Sup buddy");
        writer.flush();
        writer.close();

        Scanner scanner = new Scanner(stdout);
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }
}

私のアプリケーション

public class Test {

    public static void main(String[] args) throws Exception {
        Scanner console = new Scanner(System.in);
        System.out.println("heello World");
        while(console.hasNextLine()) {
            System.out.println(console.nextLine());
        }
    }
}

ドライバー印刷の実行

heello World
Sup buddy

何らかの理由で、close(). 一flush()人ではやりません。

編集の代わりに を指定した場合にも機能しclose()ます\n

だから

writer.write("Sup buddy");
writer.write("\n");
writer.write("this is more\n");
writer.flush();    

ドライバーが印刷します

heello World
Sup buddy
this is more
于 2013-09-19T19:44:18.133 に答える