2011-09-15 1 views
0

종료되지 않습니다외부 프로그램은 내가 아래에이 코드를 사용하여 자바에서 외부 프로그램을 실행하려고하면

Process p; 
rn = Runtime.getRuntime(); 

String[] unzip = new String[2]; 

unzip[0]="unzip"; 

unzip[1]=archive ; 

public void dezip() throws IOException{ 

    p = rn.exec(unzip); 
    int ret = p.exitValue(); 

System.out.println("End of unzip method"); 

을하지만 내 System.out가 실행되지 않습니다 마지막 unzip 방법에서 우리가 종료 것처럼. unzip() 호출은 작업의 절반 만 수행하며 내 아카이브의 일부만 압축이 풀립니다. ps -x 또는 htop을 명령 줄에서 사용할 때 압축 해제 프로세스가 여전히 여기 있습니다.

도와주세요.

+0

이것은 올바른 코드에서 실제 복사/붙여 넣기가 아닙니까? 당신은'unzip'이라는 방법에 대해서 이야기합니다.'dezip'은 의미합니까? –

+0

죄송합니다. 리눅스를 사용하고 있으므로 unzip 명령입니다. [link] http://linux.about.com/od/commands/l/blcmdl1_unzip.htm – lemoos

답변

1

아마도 프로세스에서 InputStream을 읽어야합니다. 일부 네이티브 플랫폼은 표준 입력 및 출력 스트림, 신속하게 입력 스트림을 쓰거나의 출력 스트림을 읽을 실패 제한된 버퍼 크기를 제공하기 때문에

을 : 상태 Process

의 자바 독을 참조하십시오 하위 프로세스로 인해 하위 프로세스 이 차단되고 교착 상태가 발생할 수도 있습니다.

+1

** 분명히 ** 프로세스의 * 출력 * 및 * 오류 * 스트림을 읽고 플러시해야합니다. 'Process.getOutputStream'과'Process.getErrorStream'을 참조하십시오. –

+0

나는 그것을 얻지 못합니다 .i 압축 해제 메서드를 호출하고 작업의 절반 만 수행합니다. 스트림이 필요한 이유는 무엇입니까? – lemoos

+0

문제가 해결되었습니다. 압축 해제 명령에 매우 조용한 모드로 -qq 인수를 사용했습니다. 그리고 완벽하게 작동했습니다. 당신이 옳았습니다. 그것은 버퍼 크기 문제였습니다. – lemoos

0

다음을 시도하십시오 :

p = rn.exec(unzip); 
p.waitFor() 

내가 뭔가를 변경 바랍니다.

+0

아니요, 'exitValue'는 자식 프로세스가 종료 될 때까지 기다립니다. –

+0

나는 이미 그것을 시도했다. p.waitFor()와 같은 문제가 있습니다. – lemoos

1

unzip 명령이 프롬프트됩니다 (파일이 이미 존재하고 덮어 쓸 것인지 묻는 메시지).

또한 자바 프로그램의 중간에있는 백 쿼트입니까? 공백이나 특수 문자가 포함 된 디렉토리를 처리하기 위해 Windows 시스템에서 실행하면 실행 파일 경로가 인용되는 경우

+0

아니요 역 인용 부호가 아니므로 스택 오버플로 메시지 편집기에 익숙하지 않아 코드에 역 인용 부호를 넣습니다. – lemoos

1
  1. 확실히 외부 프로그램이
  2. 확인 사용자 입력을 기다리지 않습니다합니다.

추신. java.lang.Runtime 클래스를 사용했지만 java.lang.ProcessBuilder 클래스가 훨씬 우수하다는 것을 알았습니다. 현재 작업 디렉토리를 지정할 수 있으며 가장 중요한 것은 시스템 환경을 지정할 수 있습니다.

+0

내 외부 프로그램이 사용자 입력을 기다리지 않습니다. – lemoos

+0

Java에서 외부 명령을 실행하는 것은 매우 쉬운 것처럼 보이지만 실제로는 그렇게 멀리 떨어져 있습니다. STDINT, STDOUT 및 STDERR을 내리려고 했습니까? –