홈>
아래 코드를 사용하여 netbeans에서 java 명령의 결과를 얻으려고합니다.
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
p = rt.exec(cmd);
p.waitFor();
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch(Exception e){
//
}
그리고 다음과 같은 결과를 기대하지만 콘솔에는 아무것도 표시되지 않습니다.
사용법 : javac 가능한 옵션은 다음과 같습니다. -g 모든 디버깅 정보를 생성합니다 -g : 없음 디버깅 정보를 생성하지 않습니다 -g : {lines, vars, source} 디버깅 정보 만 생성 -nowarn 경고를 생성하지 않습니다
java -cp my.jar com.my.sample
Hello 샘플 텍스트
- 답변 # 1
시스템에 따라 두 가지가 있습니다.
먼저
추가로, 인수를 제공하지 않는 것은 잘못된 상황이므로 메시지가 표준 출력 대신 오류 스트림에 기록 된 경우 일 수 있습니다. 이 경우p.waitFor()
를 통해 프로세스가 완료되기를 기다리고 있습니다. 프로그램의 출력을 읽기 전에 파이프의 용량이 모두 소모되면 프로그램이 출력을 모두 작성했을 때만 완료 할 수 있으므로 영원히 차단 될 수 있습니다. 파이프의 실제 용량은 시스템에 따라 다르며 지정되지 않습니다.p.getErrorStream()
를 읽어야합니다.p.getInputStream()
대신 (내 시스템에서는 그렇지 않았습니다).시도 할 수 있습니다
인쇄하지 않고 완료되면
p.getErrorStream()
를 사용해보십시오.p.getInputStream()
대신 .하위 프로세스의 출력을 콘솔에 인쇄하려는 경우 훨씬 더 잘 수행 할 수 있습니다.
입력 및 출력 채널을 하위 프로세스의 입력 및 출력 채널에 연결합니다. 따라서이 경우 파이프를 처리 할 필요가 없습니다.
그러나 실제로 프로그램에서 출력을 처리하려면 인쇄는 단지 예일뿐입니다.
ProcessBuilder
여전히 흥미로운 옵션이 있습니다 :redirectErrorStream(true)
를 사용하여 오류 출력을 표준 출력과 동일한 채널에 쓰도록 지시하므로 처리 할 출력은 하나만 있습니다.