저번 시간에 [Java]외부명령어 실행 이란걸 해봤습니다.

정상적일때는 특별히 문제는 없지만, 만약 에러가 발생했을때는

출력을 해주지 못하는 경우 가 생깁니다.

SequenceInputStream을 이용해 정상적일때와 에러일때의 메세지가 모두 출력 되도록 해보겠습니다.

 

먼저, 저번시간의 소스로 진짜 에러일때 출력이 되지 않는 지 알아보도록 하겠습니다.

eclipse에서 실행한 결과입니다.

 

image1.png

 

아무것도 표시가 안되네요..

그럼 아래와 같이 코드를 변경해 보겠습니다.

// 스캐너클래스를 사용해 InputStream을 스캔함
//			Scanner s = new Scanner(process.getInputStream());
			Scanner s = new Scanner(process.getErrorStream());

 

에러 스트림만 나오게 하고 eclipse에서 실행을 시키면....

image2.png

 에러 메세지가 나오네요.

 

그럼, 정상적일때와 에러 메세지를 같이 나오게 하는방법이 없을까요?

서두에서도 말했듯이 SequenceInputStream을 사용하면 정상적일때와 에러일때 모두 출력 할 수 있답니다. 

소스를 아래와 같이 추가합니다.

 

ProcessBuilderExample.java

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();
		}
	}
 
}

 

소스를 추가한 다음 먼저 정상적일 때를 테스트 해보겠습니다.

image4.png

 

 

다음은 에러일 때의 경우를 실행해 봅니다.

image3.png

 

모두 정성적으로 나오네요. ^^

 SequenceInputStream을 사용하면 여러개의 스트림을 하나의 스트림으로 사용 할 수 있답니다.

저두 이런게 있는줄 몰랐습니다. ^^;;

저걸 몰랐을때는 정상적인 메세지와 에러메세지를 따로따로 while문으로 출력 시켰었는데 SequenceInputStream을 사용하니

소스 코드도 심플해지고 사용하기도 쉽고 좋네요.^^;

 

감사합니다.