22

Java プロジェクトにあるパッケージの 1 つの関数から .exe ファイルを実行する必要があります。現在、作業ディレクトリは Java のプロジェクトのルート ディレクトリですが、私のプロジェクトのサブディレクトリにある .exe ファイルです。プロジェクトの構成は次のとおりです。

ROOT_DIR
|.......->com
|         |......->somepackage
|                 |.........->callerClass.java
|
|.......->resource
         |........->external.exe

最初に、次の方法で .exe ファイルを直接実行しようとしました。

String command = "resources\\external.exe  -i input -o putpot";
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

しかし問題は、外部の.exeが独自のディレクトリ内のいくつかのファイルにアクセスする必要があり、ルートディレクトリがそのディレクトリであると考え続けることです。問題を解決するために .bat ファイルを使用しようとしましたが、同じ問題が発生します。

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "resources\\helper.bat"});

.bat ファイルは .exe ファイルと同じディレクトリにありますが、同じ問題が発生します。.bat ファイルの内容は次のとおりです。

@echo off
echo starting process...

external.exe -i input -o output

pause

.bat ファイルをルートに移動してその内容を修正しても、問題は解決しません。plz plz plz ヘルプ

4

3 に答える 3

26

これを実装するには、ProcessBuilder クラスを使用できます。これは次のようになります。

File pathToExecutable = new File( "resources/external.exe" );
ProcessBuilder builder = new ProcessBuilder( pathToExecutable.getAbsolutePath(), "-i", "input", "-o", "output");
builder.directory( new File( "resources" ).getAbsoluteFile() ); // this is where you set the root folder for the executable to run with
builder.redirectErrorStream(true);
Process process =  builder.start();

Scanner s = new Scanner(process.getInputStream());
StringBuilder text = new StringBuilder();
while (s.hasNextLine()) {
  text.append(s.nextLine());
  text.append("\n");
}
s.close();

int result = process.waitFor();

System.out.printf( "Process exited with result %d and output %s%n", result, text );

これは非常に多くのコードですが、プロセスの実行方法をより詳細に制御できます。

于 2011-07-25T03:45:49.037 に答える
17

この形式のexecメソッドを使用して、作業ディレクトリを指定します

public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)
             throws IOException

作業ディレクトリは 3 番目の引数です。特別な環境を設定する必要がない場合は、null合格できます。envp

この便利な方法もあります:

public Process exec(String command,
                    String[] envp,
                    File dir)
             throws IOException

...コマンドを 1 つの文字列で指定する場所 (配列に変換されるだけです。詳細についてはドキュメントを参照してください)。

于 2011-07-25T03:39:29.100 に答える