Java で OS コマンドを発行するには、ProcessBuilder クラスや Runtime.getRuntime().exec() メソッドを使用します。以下に、それぞれの方法で OS コマンドを実行するサンプルコードを示します。
方法 1: ProcessBuilder を使用する場合
ProcessBuilder は、複雑なプロセスの設定および実行ができるクラスです。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExecuteCommand {
public static void main(String[] args) {
try {
// コマンドを設定する
ProcessBuilder processBuilder = new ProcessBuilder();
// Windows の場合
// processBuilder.command("cmd.exe", "/c", "your-command");
// Linux/Mac の場合
processBuilder.command("sh", "-c", "your-command");
// プロセスを開始する
Process process = processBuilder.start();
// 標準出力を読み取る
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// プロセスの終了を待つ
int exitCode = process.waitFor();
System.out.println("\nExited with code : " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法 2: Runtime.getRuntime().exec() を使用する場合
Runtime.getRuntime().exec() は、シンプルなコマンドの実行には便利ですが、プロセスの入出力ストリームを手動で管理する必要があります。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExecuteCommand {
public static void main(String[] args) {
try {
// コマンドを設定する
// Windows の場合
// Process process = Runtime.getRuntime().exec("cmd.exe /c your-command");
// Linux/Mac の場合
Process process = Runtime.getRuntime().exec("sh -c your-command");
// 標準出力を読み取る
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// プロセスの終了を待つ
int exitCode = process.waitFor();
System.out.println("\nExited with code : " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意点
- セキュリティ:
- OS コマンドの実行は潜在的にセキュリティリスクを伴います。特にユーザー入力を直接コマンドとして実行する場合は、コマンドインジェクション攻撃に対する対策が必要です。
- エラーハンドリング:
- 標準出力だけでなく、標準エラー出力もキャプチャして処理することが推奨されます。
- プラットフォーム依存:
- コマンドの構文は OS によって異なります。Windows と Unix 系 OS (Linux, macOS) のコマンドを適切に処理する必要があります。例えば、Windows ではコマンドを
cmd.exe /cで実行し、Unix 系 OS ではsh -cを使用します。
以下に、標準エラー出力もキャプチャする一例を示します:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExecuteCommand {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("sh", "-c", "your-command");
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("OUTPUT: " + line);
}
while ((line = errorReader.readLine()) != null) {
System.err.println("ERROR: " + line);
}
int exitCode = process.waitFor();
System.out.println("\nExited with code : " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
上記のコードを例に、それぞれのニーズに合わせて修正して使用してください。

コメント