스니펫:외부 프로그램의 콘솔 내용을 이클립스 콘솔뷰에서 추적하기

위클립스
이동: 둘러보기, 찾기
스니펫 분류
스니펫 (3)
스니펫/JDT (1)
스니펫/PDE (3)
스니펫/SWT (7)

[편집] 수행 결과

Console-view-example.png

[편집] 소스

/**
 * @author Jeeeyul
 */
public class DebugHandler1 extends AbstractHandler {
   private class StreamRouter extends Thread {
      private InputStream source;
      private OutputStream output;
 
      private boolean isDisposed = false;
 
      /**
       * @param source
       * @param output
       */
      public StreamRouter(Process process, OutputStream output) {
         super();
         this.source = process.getInputStream();
         this.output = output;
      }
 
      public void dispose() {
         this.isDisposed = true;
      }
 
      @Override
      public void run() {
         try {
            int len = -1;
            byte[] buf = new byte[512];
            while (!this.isDisposed) {
               len = this.source.read(buf);
               if (len != -1) {
                  this.output.write(buf, 0, len);
               }
            }
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
   }
 
   @Override
   public Object execute(ExecutionEvent e) {
      try {
         // 콘솔 준비
         IConsoleManager consoleManager = ConsolePlugin.getDefault()
               .getConsoleManager();
 
         MessageConsole console = new MessageConsole("테스트", null);
         consoleManager.addConsoles(new IConsole[] { console });
         consoleManager.showConsoleView(console);
 
         // 콘솔에 출력 스트림 준비
         MessageConsoleStream output = console.newMessageStream();
 
         // 프로세스의 준비
         ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir", "/s");
         final Process process = builder.start();
 
         // 프로세스의 출력을 콘솔로 전달하는 라우터
         final StreamRouter streamRouter = new StreamRouter(process, output);
         streamRouter.start();
 
         // 프로세스가 종료되면, 스트림 라우터를 종료시키는 스레드
         new Thread() {
            @Override
            public void run() {
               try {
                  // 프로세스가 종료될 때 까지 대기
                  process.waitFor();
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
               streamRouter.dispose();
            };
         }.start();
 
      } catch (Exception ex) {
         ex.printStackTrace();
      }
      return null;
   }
}
개인 도구
이름공간
변수
행위
포탈
탐색
도움
도구모음