วิธีที่ 1: ใช้ Runtime Class
คลาส java.lang.Runtime ให้ interface เข้ากับ environment ปัจจุบัน
- getRuntime() - คืนค่า Runtime object ของแอปพลิเคชันปัจจุบัน
- exec(String command) - รันคำสั่งในระบบปฏิบัติการ
ตัวอย่าง
import java.io.IOException;
public class RunExternalProgram {
public static void main(String[] args) throws IOException {
Runtime run = Runtime.getRuntime();
System.out.println("Executing external program...");
String file = "C:\\Program Files\\Windows Media Player\\wmplayer.exe";
run.exec(file);
}
}
วิธีที่ 2: ใช้ ProcessBuilder Class (แนะนำ)
ProcessBuilder ให้การควบคุมมากกว่า: redirect I/O, environment variables, working directory
ตัวอย่างพื้นฐาน
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("Executing external program...");
builder.start();
}
}
ตัวอย่างขั้นสูง: จัดการ Output/Error
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "dir");
builder.directory(new File("C:\\")); // Working directory
builder.redirectOutput(ProcessBuilder.Redirect.to(new File("output.txt")));
builder.redirectError(ProcessBuilder.Redirect.to(new File("error.txt")));
Process process = builder.start();
int exitCode = process.waitFor();
System.out.println("Exit code: " + exitCode);
การเปรียบเทียบ
| คุณสมบัติ | Runtime.exec() | ProcessBuilder |
|---|---|---|
| ความง่าย | สูง | ปานกลาง |
| Redirect I/O | ยาก | ง่าย (redirectOutput/Error) |
| Environment Variables | ไม่ได้ | ได้ (environment() map) |
| Working Directory | ไม่ได้ | ได้ (directory()) |
| Command Arguments | รวมในสตริงเดียว | แยกเป็น list/varargs |
ข้อควรระวัง
- Path ที่มี space ต้อง escape หรือใช้ ProcessBuilder แยก argument
- บน Linux/Mac ใช้ path แบบ Unix (เช่น
/usr/bin/vlc) - ควรจัดการ
Process object: read input/error stream, waitFor() - Java 9+ มี
ProcessHandleสำหรับจัดการ process ดีกว่า