2012-03-28 4 views
0

외부 프로세스를 실행하는 Java 코드를 적어 두어야합니다. 이 프로세스는 stdin에서 입력 행을 가져오고 stdout에 출력 행을 제공합니다. 인수 [0] 외부 과정Java에서 bash 명령을 실행하면서 입력 및 출력하기

try 
{    
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec("./" + args[0]); 
    Process proc2 = rt.exec(c); 
    int exitVal = proc2.exitValue(); 
    System.out.println("Process exitValue: " + exitVal); 
} 
catch (Throwable t){ 
} 

다음에 C는 I 프로세스에 공급하기 위해 필요한 입력 (문자열)이기 때문에 I 쓴

코드이다. 그것이 제대로 실행되고 있다면 exitVal = 0을 얻을 것이고 대신 아무것도 얻지 못합니다. 또한 실제로 인쇄하고자하는 것은 외부 프로세스의 출력입니다 (주어진 예제에서 "6"이됩니다).

+0

'캐치 (의 Throwable t)를 {}'...하지 않을 http://www.javapractices.com/topic/TopicAction 그 .do? Id = 16 – artbristol

답변

0

"아무것도 얻지 못할"수 없습니다. 메서드 exitValue()은 기본 유형을 반환하므로 null 일 수도 있습니다. 그러나이 방법은 고생 할 수 있습니다. 이것은 프로세스가 여전히 실행 중이기 때문에 발생합니다.

"피드"하지 않았기 때문에 실행 중일 수 있습니까? 이 경우해야 할 일은 proc2.getOutputStream()으로 전화하여 필요한 내용을이 스트림에 씁니다. 프로세스의 출력을 읽고 싶다면 proc2.getInputStream()을 사용하고 스트림에서 읽으십시오.

자세한 내용은 ProcessBuilder을 참조하십시오. 간단한 것보다 더 나은 "객체 지향"API 인 Runtime.exec()을 제공합니다.

+0

답장을 보내 주셔서 감사합니다. ProcessBuilder를 사용하여 성공하지 못함 :/문제는 동일하게 유지됩니다 ... 실행 파일의 작동 방식은 다음과 같습니다 (Enter 키를 누른 다음 문자열 입력 -> Enter). 기본적으로 하나의 문자열입니다. 프로세스에서, 나는이 프로세스가 표준을 기다리는 것을 알 수있는 방법 만 필요로한다. –

2

통신하려면 getInputStream()getOutputStream()을 사용해야합니다 (javadocs 참조).

프로세스에서 모든 데이터를 읽지 않으면 프로세스가 중단되어 교착 상태가 발생할 수도 있습니다. 일반적인 문제에 대한 간단한 소개는 this blog post을 참조하십시오. 최소한 프로세스 출력에서 ​​모든 데이터를 읽어야합니다.

0

당신은 '<'재와 프로그램 입력 공급할 수 :

{ 
    Process p = Runtime.getRuntime().exec("wc < pom.xml"); 
    p.waitFor(); 
    System.out.println(p.exitValue()); 
    BufferedReader bri = new BufferedReader 
    (new InputStreamReader(p.getInputStream())); 
    String line; 
    while ((line = bri.readLine()) != null) { 
    System.out.println(line); 
    } 
    bri.close(); 
} 
+0

답장을 보내 주셔서 감사합니다! 그게 내 실행 파일에 파일을 제공하고 싶지는 않지만 문자열입니다. –

+1

[this] (http://www.rgagnon.com/javadetails/java-0014.html)에서 확인할 수 있습니다. – wytten

관련 문제