>

아래 코드를 사용하여 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() 대신  (내 시스템에서는 그렇지 않았습니다).

    시도 할 수 있습니다

    Runtime rt = Runtime.getRuntime();
    try {
        String cmd = "javac";
        // OR String cmd = "cmd /c javac";
        // OR String cmd = "java -cp myjar com.my.sample";
        Process p = rt.exec(cmd);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        p.waitFor();
    } catch(Exception e){
        e.printStackTrace();
    }
    
    

    인쇄하지 않고 완료되면 p.getErrorStream() 를 사용해보십시오.   p.getInputStream() 대신 .

    하위 프로세스의 출력을 콘솔에 인쇄하려는 경우 훨씬 더 잘 수행 할 수 있습니다.

    try {
        String cmd = "javac";
        // OR String cmd = "cmd /c javac";
        // OR String cmd = "java -cp myjar com.my.sample";
        Process p = new ProcessBuilder(cmd).inheritIO().start();
        p.waitFor();
    } catch(Exception e){
        e.printStackTrace();
    }
    
    

    입력 및 출력 채널을 하위 프로세스의 입력 및 출력 채널에 연결합니다. 따라서이 경우 파이프를 처리 할 필요가 없습니다.

    그러나 실제로 프로그램에서 출력을 처리하려면 인쇄는 단지 예일뿐입니다. ProcessBuilder  여전히 흥미로운 옵션이 있습니다 :

    try {
        String cmd = "javac";
        // OR String cmd = "cmd /c javac";
        // OR String cmd = "java -cp myjar com.my.sample";
        Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        p.waitFor();
    } catch(Exception e){
        e.printStackTrace();
    }
    
    
    redirectErrorStream(true) 를 사용하여 오류 출력을 표준 출력과 동일한 채널에 쓰도록 지시하므로 처리 할 출력은 하나만 있습니다.

  • 이전 python - 배열 fileld postgres에서 가장 일반적인 단어
  • 다음 javascript - 10 월 cms - 프런트 엔드 양식을 사용하여 png 이미지를 저장하려면 어떻게해야합니까?