JAVAでOSコマンドを発行

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();
        }
    }
}

上記のコードを例に、それぞれのニーズに合わせて修正して使用してください。

コメント

タイトルとURLをコピーしました