Javaから他のネイティブ・アプリケーションを起動するには,J2SE 5.0ではProcessBuilderクラス,それ以前ではRuntimeクラスを使用します。これでこと足りる場合も多くあります。

しかし,これらのクラスでは困ることもあります。問題になるのは以下の二つの場合です。

  • 起動するアプリケーションがどこにあるかわからない
  • どのアプリケーションを起動するのかがわからない

自分のマシンであれば,アプリケーションがインストールされている場所はわかります。しかし,他の人のマシンでは,どこにインストールされているかは必ずしもわかりません。インストールされているかどうかすらわからいないことも少なくありません。

このような場合,Javaだけではどうしようもありません。Java Native Interface(JNI)を使用してレジストリを調べるといった方法を採らなくてはならなくなります。

もっと問題なのは,起動するアプリケーションがわからない場合です。

例えば,Webブラウザを考えてみましょう。ブラウザには様々なものがあります。Windowsの場合はFirefox,Internet Explorer(IE),Operaなどなど。多くのユーザーはIEを使用しているかもしれませんが,断定はできません。つまり「ブラウザを起動する」といっただけでは,どのブラウザを起動すればいいのかわからないのです。加えて,起動しようとしたブラウザによってはインストールされていない可能性もあります。

この問題はメーラーやエディタでも同じです。

OSによっては,MIMEタイプごとにデフォルトで起動するアプリケーションが決まっています。HTMLファイルであればIE,メーラはOutlookなどが設定されています。Javaからこの情報を扱えればいいのですが,JNIを使用しない限り調べることができませんでした。

そこで登場したのが,Java SE 6のjava.awt.Desktopクラスです。

ブラウザの起動

手始めにブラウザを起動してみましょう。

サンプルはここからダウンロードできます:DesktopSample1.java

Desktop.クラスはstaticメソッドのgetDesktopメソッドで取得できます。あとはbrowseメソッドをコールするだけです。

注意すべき個所は,browseメソッドの引数がURLクラスではなく,URIクラスだというところだけです。

public DesktopSample1(String uri) {
    // Desktopオブジェクトの取得
    Desktop desktop = Desktop.getDesktop();

    try {
        // ブラウザの起動
        desktop.browse(new URI(uri));
    } catch (URISyntaxException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

DesktopSample1クラスを実行すると,IEをデフォルトに設定してある場合はIEが,他のブラウザをデフォルトに設定してある場合はそのブラウザが起動するはずです。

他のアプリケーションの起動

他のアプリケーションも,ブラウザと同様に起動できます。Desktopクラスで扱える機能を表1に示しました。

表1 Desktopクラスで扱える機能
機能 メソッド名
ブラウズ browse
メール mail
編集 edit
オープン open
印刷 print

mailメソッドの引数の型はURIクラス,もしくは引数なしです。その他の三つのメソッドの引数の型はすべてFileクラスです。

これらのメソッドを使ったサンプルを作ってみました。

サンプルはここからダウンロードできます:DesktopSample2.java

機能とロケーションを指定してDesktopクラスの適切なメソッドをコールするだけのクラスです。

public DesktopSample2(String method, String location) {
    Desktop desktop = Desktop.getDesktop();

    try {
        if (method.equals("browse")) {
            desktop.browse(new URI(location));
        } else if (method.equals("mail")) {
            desktop.mail(new URI(location));
        } else if (method.equals("edit")) {
            desktop.edit(new File(location));
        } else if (method.equals("open")) {
            desktop.open(new File(location));
        } else if (method.equals("print")) {
            desktop.print(new File(location));
        }
    } catch (URISyntaxException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

筆者の環境では,ブラウザとしてIE,メーラーとしてOutlook Express,エディタとしてメモ帳が起動しました。皆さんの環境ではいかがですか?

この機能は,ファイル・マネージャのようなアプリケーションを作成するといった様々な用途に利用できるはずです。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

櫻庭にとって例年,1月から2月にかけて散財の日々が続きます。というのも,この季節はショコラティエ(チョコレート職人)が腕によりをかけたチョコレートが巷をにぎわすからであります。また,チョコレートを食べるのには冬の室温ぐらいがちょうどいいのです。

もちろん,当然のごとく自分買いです。

今年の目玉はフランス以外に出展するのは初というベルナシオン。また,時期的にはちょっと先になりますがノカチョコレートも気になる存在であります。もちろん,既存のショコラティエも忘れるわけにはいきません。

というわけで,財布はやせ細り,体重だけは増え続けるという日々を過ごすわけであります。