2012년 9월 12일 수요일

자바에서 Process 와 Runtime.getRuntime().exec()를 이용한 외부 프로그램 실행시..

자바에서 Process 와 Runtime.getRuntime().exec()를 이용한 외부 프로그램 실행시..
특정디렉토리에서 수행되도록 하는 경우.

주의할 점은 명령실행 후 출력되는 내용이 getInputStream()으로 대부분 나오지만,
간혹 getErrorStream() 으로 내보내지는 경우도 있으니, 둘다 확인해봐야 한다.




public class Test {

public static void main( String[] args ) {

try {

Process child = Runtime.getRuntime().exec( "java -version", null, new File( "D:\\Java\\jdk1.6.0_16\\bin\\" ) );

System.out.println( readAll( child ) );

child.waitFor();

System.out.println( child.exitValue() );
}
catch ( Exception e ) {

e.printStackTrace();
}
}

private static String readAll( Process child ) {

StringBuffer sb = new StringBuffer();

sb.append( read( child.getInputStream() ) ).append( "\n" );
sb.append( read( child.getErrorStream() ) );

/**
* (필수) OutputStream 을 닫는다.
* waitFor() 무한대기 방지를 위해
*/
try {
child.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}

return sb.toString().trim();
}

private static String read( InputStream in ) {

StringBuffer sb = new StringBuffer();

BufferedReader br = null;

try {

String line = null;

br = new BufferedReader( new InputStreamReader( in ));

while ( ( line = br.readLine() ) != null ) {

sb.append( line ).append( "\n" );
}

}
catch (IOException e) {
e.printStackTrace();
}
finally {

/**
* (필수) InputStream 을 닫는다.
* waitFor() 무한대기 방지를 위해
*/
try {

if ( br != null ) br.close ( );
} catch (IOException e) {
e.printStackTrace();
}
}

// 문자열의 앞/뒤 공백을 제거하고 담는다.
return Util.emptyString( sb.toString() ).trim();
}

}

댓글 없음:

댓글 쓰기