2010-02-28 3 views
0

제목이 혼란 스럽다면 미안하지만 자바의 다른 응용 프로그램으로 파이프되는 응용 프로그램의 표준 출력을 가져올 수 있는지 궁금합니다.다른 응용 프로그램에 파이프 된 응용 프로그램의 콘솔 텍스트 캡쳐

다음은 명령 줄입니다.

sox -d -t wav - | lame - test.mp3 

bash에서 실행하면 출력됩니다.

Input File  : '/dev/dsp' (ossdsp) 
Channels  : 2 
Sample Rate : 48000 
Precision  : 16-bit 
Sample Encoding: 16-bit Signed Integer PCM 

In:0.00% 00:00:25.00 [00:00:00.00] Out:1.20M [  -|=- ]  Clip:0 

마지막 줄은 사용자가 SIGINT를 보낼 때까지 sox에 의해 업데이트됩니다.

문제는 Java에서 해당 프로세스의 InputStream이 데이터를 생성하지 않는다는 것입니다. 그러나 내가 간지럽 히기 위해 sox의 파이프를 생략하면 sox -d -t wav test.wav, InputStream이 데이터를 가져옵니다. 제 질문은, 콘솔에 무슨 일이 일어 났습니까? 어떻게 접근 할 수 있습니까?

+0

어떻게 Java를 사용하여이 명령을 실행합니까? 'Runtime.exec()'? 'ProcessBuilder'? –

답변

1

파이프 문자 때문에 bash가 sox -d -t wav - | lame - test.mp3을 실행하면 bash는 각 프로세스를 실행하기 위해 두 프로세스를 포크 한 다음 첫 번째 프로세스의 stdout을 stdin과 두 번째 프로세스를 연결합니다. Bash는 두 프로세스 중 stderr에 특정한 것을하지 않으므로 sox (Input File ...)에서 보는 화면 출력은 파이프 연산의 일부가 아닙니다.

귀하의 질문에서 이해할 수있는 것부터, 당신은 그 두 가지 색소와 절름발이 프로세스를 시작하는 하나의 자바 프로그램을 가지고 있습니다. 어떻게하는지에 대한 자세한 내용은 좋을 것입니다. 그러나 화면 출력을 얻으려는 경우 sox 프로세스에서 stderr를 읽어야한다는 예를 보여주었습니다.

+0

hmmm, 지금 콘솔을 읽을 수 있지만 stderr에서 CMD/C 을 사용하여 스트림을 보내야합니다. 내 질문에 대답 같아요 – ken

+0

오, 후속 질문. 지금 나는 산란 된 sox를 ​​죽일 수 없다. process.destroy가 작동하지 않습니다. – ken