2010-05-27 6 views
3
Process p; 
String line; 
String path; 
String[] params = new String [3]; 

params[0] = "D:\\prog.exe"; 
params[1] = picA+".jpg"; 
params[2] = picB+".jpg"; 

try 
{ 
    p = Runtime.getRuntime().exec(params); 

    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    while ((line = input.readLine()) != null) 
     System.out.println(line); 

    input.close(); 
} 
catch (IOException e) 
{ 
    System.out.println(" procccess not read"+e); 
} 

아무런 오류가 없으며 아무 것도 없습니다. cmd.exe에서 prog.exe가 정상적으로 작동합니다.자바 코드에서 인수를 취하는 외부 프로그램을 실행하십시오.

이 코드를 작동시키기 위해 개선해야 할 사항은 무엇입니까?

+3

그냥 작은 관찰 : 자바는 C되지 않습니다, 당신은 선언 할 필요가 없습니다 당신의 코드 블록 앞에있는 변수. 사실 가비지 컬렉터가 블록을 정리하기가 쉬울 때부터 블록 내부에 선언하는 것이 더 나을 때가 있습니다. –

답변

2

아마도 결과 코드를 얻으려면 waitFor()를 사용해야합니다.

String path; 
String[] params = new String [3]; 

        params[0] = "D:\\prog.exe"; 
     params[1] = picA+".jpg"; 
     params[2] = picB+".jpg"; 

     try { 
      final Process p = Runtime.getRuntime().exec(params); 
      Thread thread = new Thread() { 
       public void run() { 
        String line; 
        BufferedReader input = 
         new BufferedReader 
         (new InputStreamReader(p.getInputStream())); 

        while ((line = input.readLine()) != null) 
         System.out.println(line); 


        input.close(); 
       } catch (IOException e) {System.out.println(" procccess not read"+e);} 
      }; 
      thread.start(); 
      int result = p.waitFor(); 
      thread.join(); 
      if (result != 0) { 
       System.out.println("Process failed with status: " + result); 
      } 
+0

처럼 결과가 float이고 -1.0737415E9가됩니다. – questioner

+0

왜 float입니까? 어쨌든 이것은 prog.exe의 출력 상태입니다. 그 의미는 실행중인 프로그램에 따라 다릅니다. –

+0

옙, 그리고 그것은 오류 코드 (내 경우에는 너무 많은 스레드에 대한) 필요 없어하지만 지금은 작동 중입니다 무슨 일이 있었는지 모르겠지만 waitFor(); 그리고 Thread.sleep()은 조사에 유용했습니다. – questioner

3

을 사용하면보다 p = new ProcessBuilder(params).start(); 대신

p = Runtime.getRuntime().exec(params);

기타 잘 보인다.

+0

그는 ProcessBuilder를 사용하여 단일 프로세스를 실행해야하는 이유는 무엇입니까? –

+0

ProcessBuilder는 Runtime.exec를 대체하기 위해 작성되었으며 프로세스를 쉽게 사용자 정의 할 수 있으며 프로세스 시작을보다 잘 제어 할 수 있습니다. 코드에 실제로 잘못된 점이 없으므로 – Robert

1

난 그냥 내 시스템이 시도 : 이것은 표준 출력의 덤프가 다른 스레드에서 수행되어야 함을 의미

public static void main(String[] args) throws IOException { 
     String[] params = { "svn", "help" }; 
     Process p = Runtime.getRuntime().exec(params); 

     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     String line; 
     while ((line = input.readLine()) != null) { 
      System.out.println(line); 
     } 

     input.close(); 
    } 

과 괜찮 았는데. 사용중인 프로그램이 실제로 콘솔에 무엇인가를 인쇄하고 있습니까? 입력으로 jpeg가 걸리는 것을 볼 수 있습니다. 아마 stdout이 아닌 파일에 씁니다.

+0

아니요, 콘솔에 일부 플로트 숫자를 씁니다. – questioner

+0

p가 실제로 아무것도 출력하기 전에 readLine()이 호출되어 null이 반환되어 프로그램이 종료됩니다. p를 기다려야합니다. p.waitFor()는 Maurice가 제안한 것처럼 작동 할 수도 있지만, 필자는이 예제를 사용하여 해당 호출을 중단했다 (반환하지 않음). Thread.currentThread()를 사용해 볼 수도 있습니다. wait (10); while 루프 이전에 변경 사항이 있는지 확인하십시오 (동기화에 문제가있는 경우). –

0
그냥 프로세스의 입력 스트림에서 읽기처럼, 당신은 또한이 같은 오류 스트림에서 읽을 수 있습니다

:

Process p; 
    String line; 
    String path; 
    String[] params = new String [3]; 

    params[0] = "D:\\prog.exe"; 
    params[1] = picA+".jpg"; 
    params[2] = picB+".jpg"; 

    try { 
     p = Runtime.getRuntime().exec(params); 

     BufferedReader input = 
      new BufferedReader 
       (new InputStreamReader(p.getInputStream())); 

     BufferedReader error = 
      new BufferedReader 
       (new InputStreamReader(p.getErrorStream())); 

      while ((line = input.readLine()) != null) 
       System.out.println(line); 


      while ((line = error.readLine()) != null) 
       System.out.println(line); 

      input.close(); 
      error.close(); 

    } catch (IOException e) { 
      System.out.println(" procccess not read"+e); 
    } 
관련 문제