강좌 & 팁
글 수 2,412
2012.05.06 12:30:24 (*.52.177.29)
42879
저번 시간에 [Java]외부명령어 실행 이란걸 해봤습니다.
정상적일때는 특별히 문제는 없지만, 만약 에러가 발생했을때는
출력을 해주지 못하는 경우 가 생깁니다.
SequenceInputStream을 이용해 정상적일때와 에러일때의 메세지가 모두 출력 되도록 해보겠습니다.
먼저, 저번시간의 소스로 진짜 에러일때 출력이 되지 않는 지 알아보도록 하겠습니다.
eclipse에서 실행한 결과입니다.
아무것도 표시가 안되네요..
그럼 아래와 같이 코드를 변경해 보겠습니다.
// 스캐너클래스를 사용해 InputStream을 스캔함 // Scanner s = new Scanner(process.getInputStream()); Scanner s = new Scanner(process.getErrorStream());
에러 스트림만 나오게 하고 eclipse에서 실행을 시키면....
에러 메세지가 나오네요.
그럼, 정상적일때와 에러 메세지를 같이 나오게 하는방법이 없을까요?
서두에서도 말했듯이 SequenceInputStream을 사용하면 정상적일때와 에러일때 모두 출력 할 수 있답니다.
소스를 아래와 같이 추가합니다.
import java.io.IOException; import java.io.SequenceInputStream; import java.util.Scanner; /** * @author falbb * */ public class ProcessBuilderExample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // 실행 커맨드 String[] cmd = { "cmd", "/c", "tasklist", "/?" }; // String[] cmd = { "cmd", "/c", "tasklist111", "/?" }; // 일부러 없는 명령문을 넣음 Process process = null; try { // 프로세스빌더 실행 process = new ProcessBuilder(cmd).start(); // SequenceInputStream은 여러개의 스트림을 하나의 스트림으로 연결해줌. SequenceInputStream seqIn = new SequenceInputStream( process.getInputStream(), process.getErrorStream()); // 스캐너클래스를 사용해 InputStream을 스캔함 // Scanner s = new Scanner(process.getInputStream()); // Scanner s = new Scanner(process.getErrorStream()); Scanner s = new Scanner(seqIn); while (s.hasNextLine() == true) { // 표준출력으로 출력 System.out.println(s.nextLine()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
소스를 추가한 다음 먼저 정상적일 때를 테스트 해보겠습니다.
다음은 에러일 때의 경우를 실행해 봅니다.
모두 정성적으로 나오네요. ^^
SequenceInputStream을 사용하면 여러개의 스트림을 하나의 스트림으로 사용 할 수 있답니다.
저두 이런게 있는줄 몰랐습니다. ^^;;
저걸 몰랐을때는 정상적인 메세지와 에러메세지를 따로따로 while문으로 출력 시켰었는데 SequenceInputStream을 사용하니
소스 코드도 심플해지고 사용하기도 쉽고 좋네요.^^;
감사합니다.