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();
}
_
Process
OuputStream
(私たちの視点)はプロセスの視点からの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
_
終了行文字( "\ n")を追加する必要があります。
お気に入り:
writer.write("I'm from the stdin!.\n");
writer.flush();