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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

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

#1

投稿記事 by dic » 9年前

外部プログラムを起動するプログラムを書いているのですが、つまづきました。

メモ帳は起動できたのですが、あるゲームの補助ツールを 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行目をコメントアウトすると
補助ツールは起動するのですが、設定ファイルの読み込みに失敗しました。
とエラーメッセージが表示され終了する。



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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 9年前

「java ProcessBuilder」でググったらすぐにそれっぽいAPIが発見できましたが、これは動きませんでしたか?
https://docs.oracle.com/javase/jp/6/api ... a.io.File)
public ProcessBuilder directory(File directory)

このプロセスビルダーの作業ディレクトリを設定します。 これ以降、このオブジェクトの start() メソッドで起動されたサブプロセスは、このディレクトリを作業ディレクトリとして使用します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

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

#3

投稿記事 by dic » 9年前

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

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

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

#4

投稿記事 by dic » 9年前

最初の例外発生の原因も分かりました。
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() );
		}
	}
}

閉鎖

“C言語何でも質問掲示板” へ戻る