Runtime 클래스 활용하기
Java는 java.lang.Runtime이라는 클래스를 기본으로 제공하며, 이 클래스를 사용하면 현재 실행 환경(시스템)과 상호작용할 수 있습니다.
이 클래스의 정적(static) 메서드인 getRuntime()은 현재 애플리케이션에 연결된 Runtime 객체를 반환합니다. 또한 exec() 메서드는 실행하고자 하는 명령어를 문자열(String) 값으로 받아 현재 시스템에서 해당 프로세스를 실행합니다.
따라서 Runtime 클래스를 사용해 외부 애플리케이션을 실행하려면 다음 두 단계만 거치면 됩니다.
getRuntime() 메서드를 호출하여 Runtime 객체를 가져옵니다.
실행할 프로그램의 경로를 문자열로 exec() 메서드에 전달하여 프로세스를 실행합니다.
예제 코드
import java.io.IOException;
public class Trail {
public static void main(String args[]) throws IOException {
Runtime run = Runtime.getRuntime();
System.out.println("외부 프로그램을 실행합니다 . . . . . . . .");
String file = "C:\\Program Files\\Windows Media Player\\wmplayer.exe";
run.exec(file);
}
}실행 결과
외부 프로그램을 실행합니다 . . . . . . . .
위 예제에서 exec() 메서드가 호출되면 Windows Media Player(wmplayer.exe)가 새로운 프로세스로 실행됩니다. 참고로 exec()는 IOException을 던질 수 있으므로 반드시 예외 처리를 해주어야 합니다.
ProcessBuilder 클래스 활용하기
ProcessBuilder 클래스도 외부 프로세스를 실행하는 또 다른 방법을 제공합니다. 이 클래스의 생성자는 실행할 명령어와 그에 따른 인수(arguments)를 가변 인수(varargs) 형태의 문자열로 받아 객체를 생성합니다.
생성된 객체의 start() 메서드를 호출하면 ProcessBuilder에 설정된 프로세스가 시작됩니다. 따라서 ProcessBuilder 클래스로 외부 프로그램을 실행하는 절차는 다음과 같습니다.
실행할 명령어와 인수를 생성자의 매개변수로 전달하여 ProcessBuilder 객체를 생성합니다.
생성된 객체에서 start() 메서드를 호출하여 프로세스를 실행합니다.
예제 코드
import java.io.IOException;
public class ExternalProcess {
public static void main(String args[]) throws IOException {
String command = "C:\\Program Files\\Windows Media Player\\wmplayer.exe";
String arg = "D:\\sample.mp3";
// 프로세스 구성
ProcessBuilder builder = new ProcessBuilder(command, arg);
System.out.println("외부 프로그램을 실행합니다 . . . . . . . .");
// 프로세스 시작
builder.start();
}
}실행 결과
외부 프로그램을 실행합니다 . . . . . . . .
위 예제에서는 Windows Media Player 실행 파일 경로와 재생할 MP3 파일 경로를 함께 전달했기 때문에, 프로그램이 실행되면서 지정한 음악 파일이 자동으로 재생됩니다.
두 방식의 차이점
Runtime.exec()는 간단하게 한 줄로 외부 프로그램을 실행할 수 있는 장점이 있지만, ProcessBuilder는 입출력 스트림 리디렉션, 작업 디렉터리 변경, 환경 변수 설정 등을 더 깔끔하게 다룰 수 있어 최근에는 ProcessBuilder 사용이 권장됩니다. 특히 파일 경로에 공백이 포함된 경우(예: "Program Files") ProcessBuilder는 인수를 배열로 분리해서 전달하므로 오류 발생 가능성이 적습니다.