2010-05-20 6 views
1

Java 코드에서 프로그램을 실행하려고합니다. 내 코드는 다음과 같습니다.Java에서 외부 프로그램 실행

public static void main(String argv[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec(new String[]{ 
      "/bin/bash", "-c", "executable -o filename.txt"}); 
     BufferedReader input = new BufferedReader(
      new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } catch (Exception err) { 
     err.printStackTrace(); 
    } 
} 

내 OS는 Mac OS X 10.6입니다.

이제는 실행하려고하는 실행 파일이 filename.txt에 출력을 내뱉기로되어 있습니다. 이 명령을 사용하여 터미널에서 실행하면 제대로 작동하고 filename.txt도 채워집니다. 그러나, 내 Java 프로그램에서 파일이 만들어지지 않습니다.

대신 실행 파일> filename.txt를 사용하면 filename.txt가 만들어 지지만 비어 있습니다. 여기에 무엇이 잘못되었는지 확실하지 않습니다. 실행하려고하는 실행 파일은 Xtide (도움이되는 경우)입니다.

내가 얻을 수있는 도움이 정말 감사 할 것입니다.

감사합니다.

+0

다음은 http://stackoverflow.com/questions/2874591/execute-external-program-from-java/2874687#2874687의 후속 작업입니다. – mdma

답변

2

출력을 파일로 재지 정하고 java에서 출력을 읽을 수 없습니다. 그것은 하나 또는 다른 것입니다. 당신이 원하는 것은 이것이다 :

 Process p = Runtime.getRuntime().exec(new String[]{ 
      "/bin/bash", "-c", "executable -o filename.txt"}); 
     p.waitFor(); 
     BufferedReader input = new BufferedReader(
      new InputStreamReader(new FileInputStream("filename.txt"))); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 

주요 변경 사항은 다음과 같습니다

  • p.waitFor(), 당신이 완료 될 때까지 기다릴 필요가 있도록 프로세스 실행이 비동기 때문이다.
  • 데이터는 MDMA의 작품 (내가 그것을 투표)에서
+0

이것의 주된 문제점은 filename.txt가 프로그램에 의해 생성되지 않는다는 것입니다. 터미널에서 똑같은 명령을 사용하면 생성됩니다. 왜 그런 일이 일어나는 지 이유를 생각해 볼 수 있습니까? 이미 폴더에 대한 모든 읽기/쓰기 권한을 설정했습니다. –

+0

당신의 명령에 파일 이름을 만들고 FileInputStream을 만들 때, 절대 아무런 작업 디렉토리 문제가 발생하지 않습니다. – mdma

+0

@Saurabh p.waitFor()를 추가하지 않았으므로 프로세스가 일찌감치 종료됩니다. –

1

대답 (.이 비어 있기 때문에) 파일에서가 아닌 프로세스의 출력에서 ​​읽기,하지만 당신은 할 수 있습니다 당신이 executable에서 직접 출력 스트림을 읽어 수행 버전 고려 : 만약 내가 잘못

Process p = Runtime.getRuntime().exec(new String[]{ 
      "/bin/bash", "-c", "executable"}); 
p.waitFor(); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())_; 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
+0

그건 내 첫번째 시도 였어. 그것은 그런 식으로 작동하지 않았으므로 출력을 파일에 뱉어 읽으려고했습니다. –

0

나를 수정을하지만, 증상은 다음과 같다 :

  • exec("/usr/bash", "-c", "executable > filename.txt")은 빈 파일을 만듭니다.
  • exec("/usr/bash", "-c", "executable -o filename.txt") 파일을 만들지 않습니다.
  • 위의 두 가지 중 하나 또는 둘 모두를 살펴보면 255의 종료 코드가 표시됩니다.
  • 명령 줄에서 executable -o filename.txt 또는 executable > filename.txt으로 명령을 실행하면 예상대로 작동합니다. 위의 빛에서

, 나는 가장 큰 원인은 자바에서 그것을 시작할 때 /bin/bashexecutable을 찾는되지 않는다는 생각합니다. 첫번째 예제가 빈 파일을 생성한다는 사실은 /bin/bash이 뭔가를하고 있음을 의미합니다. 당신이 bash 쉘에서

$ unknown-command > somefile.txt 

를 실행하려고하지만 명령이 찾을 수 없습니다 및 빈 "something.txt는" 파일 없다는 오류 메시지가 표시됩니다하라는 메시지를 표시합니다. (Java 응용 프로그램에서 stderr에 쓰여지고 캡처하지 않으므로 오류 메시지가 표시되지 않습니다.) 빈 "something.txt"파일이 작성되는 이유는 쉘에 의해 열리는 것입니다. 전에 "실행 파일"을 포크하고 실행하려고 시도합니다.

이 문제가 인 경우 간단한 해결책은 실행 파일의 절대 경로 이름을 사용하는 것입니다. 또한 bash 인스턴스에서 실행 파일을 실행할 필요가 없습니다. 대신 다음을 수행하십시오.

Process p = Runtime.getRuntime().exec("executable", "-o", filename.txt"); 

다음에 프로세스가 완료 될 때까지 기다렸다가 파일 내용을 읽으려고 시도하기 전에 종료 코드를 확인하십시오.

+0

그건 내 대답에 주석의 좋은 의역이야! :) – mdma

+0

@mdma - 나는 그 이상을하고 있다고 생각합니다 ... –

관련 문제