Java에서 외부 프로세스를 생성하고 주기적으로 입력에 쓰고 응답을 콘솔처럼 읽을 수 있기를 바랍니다. 그러나 대부분의 경우 프로세스의 출력을 읽을 때 사용할 수있는 것이 없습니다. 이런 종류의 일을 수행하는 좋은 습관이 있습니까 (심지어 피하는 것)? 나는 내가 (다른 일부 프로세스 (고양이)에서 읽을 수는 없지만, BufferedWriter의에서의 OutputStream을 마무리하면, 이상하게도Java에서 실행중인 외부 프로세스를 안전하게 읽고 쓰는 방법은 무엇입니까?
import org.apache.commons.exec.*;
import java.io.*;
//...
CommandLine cl = CommandLine.parse("/usr/bin/awk {print($1-1)}");
System.out.println(cl.toStrings());
Process proc = new ProcessBuilder(cl.toStrings()).start();
OutputStream os = proc.getOutputStream(); // avoiding *Buffered* classes
InputStream is = proc.getInputStream(); // to lessen buffering complications
os.write(("4" + System.getProperty("line.separator")).getBytes());
os.flush(); // Doesn't seem to flush.
// os.close(); // uncommenting works, but I'd like to keep the process running
System.out.println("reading");
System.out.println(is.read()); // read even one byte? usually is.available() -> 0
: 여기
이 작동하지 않습니다 무엇을 벗었 예제 awk, grep).
검사, http://stackoverflow.com/questions/13008526/runtime-getruntime-execcmd-hanging/13008847#13008847 여기 Arham을 – Arham
감사 대답의 나. stdErr가 채워지거나 동기화 문제를 제거하는 것이 좋은 방법이라고 생각하지 않았습니다. 별도의 스레드에서 stdErr을 읽는 것이 여기에서 도움이되지는 않습니다. 프로세스에 데이터를 전달하고 프로세스가 작동하도록하고 싶습니다. 예를 들어, 셸에서 실행하는 것처럼 계속 진행하기 전에 선을 처리하거나 응답을 기다리는 등의 작업을 수행 할 수 있습니다. 그냥 외부 프로세스를 bash -c "..."로 마무리해야합니까? – jlb
나는 유닉스 프로세스를 실행시키지 않았지만 자바에서 윈도우 프로세스를 시도했지만, 그걸 시험해 봐야 할 것이다. 그러나 내가 이해하는 한, 시스템이 아닌 사용자가 직접 응용 프로그램의 종료를 제어하려고합니다. 이를 위해 항상 사용자 정의 된 조건 내에 proc.destroy()를 넣을 수 있습니다. ?? – Arham