これがあなたがやりたいことをするための一般的なコードです。この場合、入力と出力の両方があります。私はsomeFile
プロセスに配管し、出力をに配管していますSystem.out
。Files.copy()
とをに接続するためByteStreams.copy()
のGuavaの便利なメソッドです。次に、コマンドが終了するのを待ちます。InputStream
OutputStream
final Process pr = Runtime.getRuntime().exec(cmd);
new Thread() {
public void run() {
try (OutputStream stdin = pr.getOutputStream()) {
Files.copy(someFile, stdin);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
new Thread() {
public void run() {
try (InputStream stdout = pr.getInputStream()) {
ByteStreams.copy(stdout, System.out);
}
catch (IOException e) { e.printStackTrace(); }
}
}.start();
int exitVal = pr.waitFor();
if( exitVal == 0 )
System.out.println("Command succeeded!");
else
System.out.println("Exited with error code " + exitVal);
try-with-resourcesブロックを使用してJava7より前で実行している場合は、より詳細なバージョンを使用します。
final Process pr = Runtime.getRuntime().exec(cmd);
new Thread() {
public void run() {
OutputStream stdin = null;
try {
Files.copy(someFile, stdin = pr.getOutputStream());
}
catch (IOException e) { e.printStackTrace(); }
finally {
if( stdin != null ) {
try { stdin.close(); }
catch (IOException e) { e.printStackTrace(); }
}
}
}
}.start();
new Thread() {
public void run() {
InputStream stdout = null;
try {
ByteStreams.copy(stdout = pr.getInputStream(), System.out);
}
catch (IOException e) { e.printStackTrace(); }
finally {
if( stdout != null ) {
try { stdout.close(); }
catch (IOException e) { e.printStackTrace(); }
}
}
}
}.start();
int exitVal = pr.waitFor();
if( exitVal == 0 )
System.out.println("Command succeeded!");
else
System.out.println("Exited with error code " + exitVal);