자바에서 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();
}
}