web-dev-qa-db-ja.com

JavaプロセスのInputStreamへの書き込み

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();
_

何も起こりませんでしたが。コンソールはまだ入力を待っていました。

何かご意見は?

編集:以下で受け入れられたように、質問に回答しました。私は不正なコードを表示するために編集しています(btw。Lolを含めることに失敗しました)。

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

_String line;
line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}
_
19
Gx.Zero

ProcessOuputStream(私たちの視点)はプロセスの視点からの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());
        }
    }
}
_

driverの実行

_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
_
39

終了行文字( "\ n")を追加する必要があります。

お気に入り:

writer.write("I'm from the stdin!.\n");
writer.flush();
0
Tamir Adler