AboutデジタルIT・インターネットJavaプログラミングJavaプログラミング関連情報javaの外部プログラムを実行する方法は?Javaプログラミング/Javaプログラミング関連情報javaの外部プログラムを実行する方法は?Javaのプログラム内から他のプログラムを実行させたいようなときもあります。そんなときはどうすればいいのでしょうか?今回は例をもとにプログラムの内部から外部のプログラムを実行する方法をご紹介します。ファイルの指定など注意点もご紹介します。外部プログラムはRuntimeで実行するJavaのプログラム内から他のプログラムを実行させたいようなときもあります。Javaはプラットフォームに依存しないのが特徴ですから、こうした「外部プログラムの実行」を行うと、特定のプラットフォームに依存する作りになってしまいます。した問題があったとしても行いたいときはあるはずですね。いうときに用いられるのが「java.lang.Runtime」というクラスです。これはJavaアプリケーションとその実行環境との間の橋渡しをする役目を持ちます。Javaアプリケーションは、すべてただ1つのRuntimeインスタンスをもっており、これを介してJava仮想マシン外の(Javaアプリケーションが動いている)実行環境にアクセスできます。JavaアプリケーションがもっているRuntimeインスタンスは「Runtime.getRuntime」メソッドで得ることができます。して取得したRuntimeインスタンスの「exec」メソッドを実行することで、外部のプログラムを実行できるのです。}例えば、これはWindowsでnotepad.exeを実行するサンプルです。EXEファイルへのパスが通っていれば、このように簡単にプログラムを起動できます。パスが通っていない場合でも、そのファイルをフルパスで指定することで実行は可能です。このexecは、プログラムファイルが存在しなかった場合にはIOExeptionを発生させるため、try内で実行する必要があります。これを応用して「Javaプログラム内から別のJavaプログラムを実行する」ということもできるでしょうか。これは、例えばこんな具合にすればよいでしょう。}}これは、Cドライブにある「allabout」フォルダの中の「FreeLife.jar」を実行するサンプルです。Javaのプログラムは、javaコマンドで実行しますね。hoge.jar」というようにして実行することが可能です。注意すべきは、ファイルの指定です。ファイルのパスをC:\allabout\FreeLife.jarと指定して「動かない」という凡ミスはよくやってしまうものです。Stringリテラル内で\記号を使うときにはエスケープして\\と書かなければいけなかったでしょう?返値のあるプログラムを実行するには?単純にプログラムを実行するだけならいいのですが、「実行した結果を得る必要がある」というような場合にはどうすればよいのでしょうか。コマンドラインのプログラムを実行し、その結果を取得するような場合ですね。execを実行するだけでは、結果は得られません。実は、execメソッドは、単に実行するだけではなく「Process」というクラスのインスタンスを返す働きをします。先ほどの例では、このProcessを使う必要がないので単純にexecしていましたが、実行するプログラムに関する情報を得る場合には、このProcessを受け取り、そこから必要な処理をしていけばいいのです。返された値を取得するなら、Processから「getInputStream」メソッドを呼び出し、InputStreamインスタンスを取得します。これは、実行中のプロセスからの入力ストリームで、プログラムから何らかの情報が返される場合には、このストリームを介して得ることができるのです。InputStreamさえ得られれば、後は必要に応じてストリームを組み合わせ、情報を取得することができますね。Windowsでdirコマンドを実行した結果を表示するサンプルを考えてみましょう。}}dirコマンドを実行しWindowsフォルダ内のファイル一覧を出力してみました。c:\\windows\\"というようにしてコマンドを実行しています。Windowsの場合、dirコマンドは「dir.exe」というプログラムがあるわけではありません。cmd.exeからdirコマンドを引数で渡して実行するという形になります。XやLinuxなどの「ls」コマンドなどはそのままlsというプログラムが存在しますから単純にexec("ls")で問題ありません。ここでは取得したInputStreamからInputStreamReader、BufferedReaderを作成していき、そこから行単位でテキストを取り出しています。このようにして必要なストリームを用意していけば、後は簡単ですね。外部プログラムの実行は、RuntimeやProcessなど、あまり今までなじみのないクラスを使うことになります。これを機会に、「外部プログラムをプロセスとして実行し、それを処理する」ということがどういうことか、ちょっと勉強しておくのもいいですね。実行する環境でプログラムがどう起動されるのかといったこともよく調べておくとよいでしょう。楽天市場でJava関連の書籍を見るAmazonでJava関連の書籍を見る※記事内容は執筆時点のものです。最新の内容をご確認ください。異なる可能性があります。About公式SNS日々の生活や仕事を楽しむための情報を毎日お届けします。