ページ 11

[Java] 外部プログラムの起動の際にディレクトリを設定する(表示する)

Posted: 2016年6月23日(木) 20:29
by dic
外部プログラムを起動するプログラムを書いているのですが、つまづきました。

メモ帳は起動できたのですが、あるゲームの補助ツールを java から起動させようとしています。
その補助ツールは起動できるのですが、設定ファイルを読み込めないとエラーが出力されます。
そこで、この補助ツールに作業ディレクトリを設定したいので、
APIを調べたのですがわかりませんでした。

以下ソースコードとエラーメッセージを載せておきます。

コード:

import java.io.*;


public class Main7_2 {
	public static void main( String[] args ) {
		//	ここは成功(フルパス指定)
		ProcessBuilder pb = new ProcessBuilder( "C:\\Windows\\System32\\notepad.exe", "C:\\Users\\owner\\Desktop\\あああ.txt" );
		try {
			pb.start();
		} catch ( Exception e ){
			System.out.println( "例外が発生しました。" + e.toString() );
		}
		
		//	パターン2
		//	ここは失敗(カレントディレクトリを指定しないと設定ファイルが読み込めない )
		ProcessBuilder pb2 = new ProcessBuilder( "C:\\Users\\owner\\Documents\\001 ツール\\023_DP_0.55.7\\DOL_PLUS1.exe" );

		File	dir = pb2.directory();
		try {
			System.out.println( "dir:" + dir.getName() );	// << ここでもエラー
			pb2.start();
		} catch( Exception e ) {
			System.out.println( "パターン2で例外が発生しました。" + e.toString() );
		}
	}
}
------ エラーメッセージ -----------
C:\Users\owner\Docume....jcpad231\ソースコード> java Main7_2
パターン2で例外が発生しました。java.lang.NullPointerException
-- Press any key to exit (Input "c" to continue) --



---- 20行目をコメントアウトすると
補助ツールは起動するのですが、設定ファイルの読み込みに失敗しました。
とエラーメッセージが表示され終了する。



------ 期待していること
補助ツールを、作業ディレクトリを指定して起動させ、設定ファイルを読み込ませる。

Re: [Java] 外部プログラムの起動の際にディレクトリを設定する(表示する)

Posted: 2016年6月23日(木) 20:50
by みけCAT
「java ProcessBuilder」でググったらすぐにそれっぽいAPIが発見できましたが、これは動きませんでしたか?
https://docs.oracle.com/javase/jp/6/api ... a.io.File)
public ProcessBuilder directory(File directory)

このプロセスビルダーの作業ディレクトリを設定します。 これ以降、このオブジェクトの start() メソッドで起動されたサブプロセスは、このディレクトリを作業ディレクトリとして使用します。

Re: [Java] 外部プログラムの起動の際にディレクトリを設定する(表示する)

Posted: 2016年6月23日(木) 22:11
by dic
>>みけCAT様
ご指摘ありがとうございます。

JDK 7 を見ていました。(とても探しづらかった。。。)
http://docs.oracle.com/javase/jp/7/api/ ... mmary.html


みけCAT様のご指摘通りに修正したところうまく動きました。
ありがとうございました。

以下ソースコードとなります。

コード:

import java.io.*;


public class Main7_2 {
	public static void main( String[] args ) {
		//	ここは成功(フルパス指定)
		ProcessBuilder pb = new ProcessBuilder( "C:\\Windows\\System32\\notepad.exe", "C:\\Users\\owner\\Desktop\\あああ.txt" );
		try {
			pb.start();
		} catch ( Exception e ){
			System.out.println( "例外が発生しました。" + e.toString() );
		}
		
		//	パターン2
		ProcessBuilder pb2 = new ProcessBuilder( "C:\\Users\\owner\\Documents\\001 ツール\\023_DP_0.55.7\\DOL_PLUS1.exe" );
		File	dir = new File( "C:\\Users\\owner\\Documents\\001 ツール\\023_DP_0.55.7" );
		try {
			pb2.directory( dir );
			pb2.start();
		} catch( Exception e ) {
			System.out.println( "パターン2で例外が発生しました。" + e.toString() );
		}
	}
}

Re: [Java] 外部プログラムの起動の際にディレクトリを設定する(表示する)

Posted: 2016年6月24日(金) 21:44
by dic
最初の例外発生の原因も分かりました。
dir.getName() もしくは、 dir.toString() は、値がセットされていないので null が返ってくるのですね。
19行目を追加することで、理解が深まりました。

コード:

import java.io.*;


public class Main7_2 {
	public static void main( String[] args ) {
		//	
		ProcessBuilder pb = new ProcessBuilder( "C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" );
		try {
			pb.start();
		} catch ( Exception e ){
			System.out.println( "例外が発生しました。" + e.toString() );
		}
		
		//	パターン2
		ProcessBuilder pb2 = new ProcessBuilder( "C:\\Users\\owner\\Documents\\001 ツール\\023_DP_0.55.7\\DOL_PLUS1.exe" );
		File	dir = new File( "C:\\Users\\owner\\Documents\\001 ツール\\023_DP_0.55.7" );
		try {
			pb2.directory( dir );
			System.out.println( dir.toString() );	//	<< 表示される
			pb2.start();
		} catch( Exception e ) {
			System.out.println( "パターン2で例外が発生しました。" + e.toString() );
		}
	}
}