문제

Java를 통해 프로세스를 시작하면 프로세스 빌더 나는 해당 프로세스의 표준 입력, 표준 출력 및 표준 오류 스트림에 Java로 액세스할 수 있습니다. InputStreams 그리고 OutputStreams.그러나 해당 스트림을 원활하게 연결하는 방법을 찾을 수 없습니다. System.in, System.out, 그리고 System.err.

사용이 가능해요 redirectErrorStream() 하나를 얻으려고 InputStream 여기에는 하위 프로세스의 표준 출력과 표준 오류가 포함되어 있으며 이를 반복하여 내 표준 출력을 통해 전송합니다. 하지만 그렇게 하고 사용자가 프로세스에 입력하도록 할 수 있는 방법을 찾을 수 없습니다. C를 사용했다 system() 부르다.

이는 Java SE 7이 출시되면 가능한 것으로 보입니다. 현재 해결 방법이 있는지 궁금합니다.결과가 나오면 보너스 포인트 isatty() 하위 프로세스에서는 리디렉션을 수행합니다.

도움이 되었습니까?

해결책

다음을 복사해야 합니다. 프로세스 out, err 및 입력 스트림을 시스템 버전으로 보냅니다.가장 쉬운 방법은 다음을 사용하는 것입니다. IOUtils Commons IO 패키지의 클래스입니다.그만큼 복사 방법 당신에게 꼭 필요한 것 같습니다.복사 메서드 호출은 별도의 스레드에 있어야 합니다.

기본 코드는 다음과 같습니다.

// Assume you already have a processBuilder all configured and ready to go
final Process process = processBuilder.start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getOutputStream(), System.out);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getErrorStream(), System.err);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(System.in, process.getInputStream());
} } ).start();

다른 팁

Commons IO를 컴파일하고 사용할 필요가 없는 John의 답변 변형:

private static void pipeOutput(Process process) {
    pipe(process.getErrorStream(), System.err);
    pipe(process.getInputStream(), System.out);
}

private static void pipe(final InputStream src, final PrintStream dest) {
    new Thread(new Runnable() {
        public void run() {
            try {
                byte[] buffer = new byte[1024];
                for (int n = 0; n != -1; n = src.read(buffer)) {
                    dest.write(buffer, 0, n);
                }
            } catch (IOException e) { // just exit
            }
        }
    }).start();
}

을 위한 System.in 다음을 사용 pipein() 대신에 pipe()

pipein(System.in, p.getOutputStream());

구현:

private static void pipein(final InputStream src, final OutputStream dest) {

    new Thread(new Runnable() {
        public void run() {
            try {
               int ret = -1;
               while ((ret = System.in.read()) != -1) {
                  dest.write(ret);
                  dest.flush();
               }
            } catch (IOException e) { // just exit
            }
        }
    }).start();

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top