Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のProcessBuilderを使ってプロセスを作成・管理する方法

Java 9では、Process APIが強化され、新たにProcessHandleインターフェースが追加されました。ProcessHandleのインスタンスはローカルプロセスを識別し、プロセスの状態(ステータス)の照会やプロセス管理を可能にします。従来はローカルプロセスのPIDを取得するためにネイティブコードが必要でしたが、ProcessHandle.Infoを使えば、その必要なくPIDやその他のプロセス情報を簡単に取得できるようになりました。

ProcessBuilderクラスは、オペレーティングシステム上で独立したプロセスを作成するために使用されるクラスです。以下の例では、ProcessBuilderクラスを利用して「notepad」アプリケーションのプロセスを作成し、その詳細情報を出力しています。

ProcessHandle.Infoで取得できる主な情報

  • pid():プロセスID(PID)
  • command():実行コマンドのパス
  • commandLine():コマンドライン全体
  • startInstant():プロセスの開始時刻
  • arguments():起動時の引数
  • user():プロセスを実行したユーザー

これらのメソッドはOptional型を返すため、値が存在しない場合に備えてorElse()などでデフォルト値を指定できます。

サンプルコード

import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;

public class ProcessBuilderTest {
    public static void main(String args[]) throws IOException {
        // notepad.exeを起動するためのProcessBuilderを作成
        ProcessBuilder pb = new ProcessBuilder("notepad.exe");
        String np = "Not Present";

        // プロセスを開始
        Process p = pb.start();

        // プロセス情報を取得
        ProcessHandle.Info info = p.info();

        System.out.printf("Process ID : %s%n", p.pid());
        System.out.printf("Command name : %s%n", info.command().orElse(np));
        System.out.printf("Command line : %s%n", info.commandLine().orElse(np));

        System.out.printf("Start time: %s%n",
            info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
                .toLocalDateTime().toString()).orElse(np));

        System.out.printf("Arguments : %s%n",
            info.arguments().map(a -> Stream.of(a)
                .collect(Collectors.joining(" "))).orElse(np));

        System.out.printf("User : %s%n", info.user().orElse(np));
    }
}

このプログラムを実行すると、次のようにメモ帳(notepad)アプリケーションが起動します。

実行結果

Process ID : 3728
Command name : C:\WINDOWS\System32\notepad.exe
Command line : Not Present
Start time: 2020-04-20T18:06:30.378
Arguments : Not Present
User : Tutorialspoint\User

このように、Java 9以降ではProcessBuilderで起動した外部プロセスに対して、PIDや実行コマンド、開始時刻、実行ユーザーといった詳細情報を、ネイティブコードに頼ることなく純粋なJava APIだけで取得・管理できるようになっています。

  1. JavaでJSON配列を作成する方法をわかりやすく解説

    JSON配列とは、角括弧で囲まれた値の順序付きコレクションのことです。具体的には「[」で始まり「]」で終わり、配列内の各値はカンマ(,)で区切られます。JSON配列のサンプル{ books: [Java, JavaFX, Hbase, Cassandra, WebGL, JOGL] }json-simpleは、JSONオブジェクトを処理するための軽量ライブラリです。このライブラリを使えば、JavaプログラムからJSONドキュメントの内容を読み取ったり、書き込んだりすることができます。json-simpleのMaven依存関係json-simpleライブラリを使用するには、まずpom.x

  2. JavaでJSONファイルを作成する方法をわかりやすく解説

    JSON(JavaScript Object Notation)は、人間が読みやすい形式でデータを交換するために設計された、軽量なテキストベースのオープン標準フォーマットです。JSONの記法は、C、C++、Java、Python、Perlなど、多くのプログラミング言語に精通したプログラマーにとって馴染み深いものとなっています。 JSONドキュメントのサンプル 以下は、書籍情報を格納した典型的なJSONドキュメントの例です。 { book: [ { id: 01, language: Java, ed