別の Java アプリケーションを実行するバッチ ファイルを実行する必要があります。実行が成功するかどうかは気にしませんし、エラーをキャプチャする必要もありません。
ProcessBuilderでこれを行うことは可能ですか? エラーをキャプチャしないと、どのような結果になりますか?
ただし、私の要件は、別の Java アプリケーションを実行することだけです。
別の Java アプリケーションを実行するバッチ ファイルを実行する必要があります。実行が成功するかどうかは気にしませんし、エラーをキャプチャする必要もありません。
ProcessBuilderでこれを行うことは可能ですか? エラーをキャプチャしないと、どのような結果になりますか?
ただし、私の要件は、別の Java アプリケーションを実行することだけです。
Runtime.getRuntime().exec()
すぐにわかるように、このアプローチは非常に面倒です。
Apache Commons Execプロジェクトを見てください。Runtime.getRuntime().exec()
およびProcessBuilder
APIの使用に関連する多くの一般的な問題を抽象化します。
次のように簡単です。
String line = "myCommand.exe";
CommandLine commandLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
int exitValue = executor.execute(commandLine);
はい、ProcessBuilder を使用して可能です。
ProcessBuilder の例:
import java.io.*;
import java.util.*;
public class CmdProcessBuilder {
public static void main(String args[])
throws InterruptedException,IOException
{
List<String> command = new ArrayList<String>();
command.add(args[0]);
ProcessBuilder builder = new ProcessBuilder(command);
Map<String, String> environ = builder.environment();
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Program terminated!");
}
}
次の例を確認してください。
http://www.rgagnon.com/javadetails/java-0014.html
http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html
以下は、ProcessBuilder
リモート アプリケーションを実行するために使用する方法の例です。入力/出力やエラーを気にしないので、次のようにできます。
List<String> args = new ArrayList<String>();
args.add ("script.bat"); // command name
args.add ("-option"); // optional args added as separate list items
ProcessBuilder pb = new ProcessBuilder (args);
Process p = pb.start();
p.waitFor();
メソッドは、waitFor()
プロセスが終了するまで待機してから続行します。このメソッドはプロセスのエラー コードを返しますが、気にしないので例には入れませんでした。
を使用して、バッチ命令またはその他のアプリケーションを実行できます。
Runtime.getRuntime().exec(cmd);
また、次のコードを使用して、実行とリターン コードの取得を待機することもできます (正しく実行されたかどうかを確認するため)。
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
int exitVal = p.exitValue();
ここにさまざまな種類の呼び出しの完全な説明があります http://www.rgagnon.com/javadetails/java-0014.html
を使用してコマンドを実行する方法を知っていると思いますProcessBuilder
。
Java からコマンドを実行すると、常にプロセスから stdout および stderr ストリームを読み取る必要があります。そうしないと、バッファがいっぱいになり、stdout または stderr ブロックの書き込みが原因でプロセスを続行できなくなる可能性があります。
以下のスニペット コードは、外部プログラムを実行するのと同じ方法で、ProcessBuilder を使用して外部 Java プログラムをコンパイルおよび実行するように記述されています。OS 環境で JAVA_HOME を設定する必要があります。もっと見る
package com.itexpert.exam;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class JavaProcessBuilder {
/**
* Provide absolute JAVA file path
*/
private static final String JAVA_FILE_LOCATION = "D:\\Test.java";
public static void main(String args[]) throws IOException{
String command[] = {"javac",JAVA_FILE_LOCATION};
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
/**
* Check if any errors or compilation errors encounter then print on Console.
*/
if( process.getErrorStream().read() != -1 ){
print("Compilation Errors",process.getErrorStream());
}
/**
* Check if javac process execute successfully or Not
* 0 - successful
*/
if( process.exitValue() == 0 ){
process = new ProcessBuilder(new String[]{"java","-cp","d:\\","Test"}).start();
/** Check if RuntimeException or Errors encounter during execution then print errors on console
* Otherwise print Output
*/
if( process.getErrorStream().read() != -1 ){
print("Errors ",process.getErrorStream());
}
else{
print("Output ",process.getInputStream());
}
}
}
private static void print(String status,InputStream input) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(input));
System.out.println("************* "+status+"***********************");
String line = null;
while((line = in.readLine()) != null ){
System.out.println(line);
}
in.close();
}
}
これが古いスレッドであることは知っていますが、このスレッドがルートレベルのアクセスを除いてOPと同じことをしようとしていることがわかったので、実装に入れる価値があると思いますが、実際には解決策が見つかりませんでした探していました。以下のメソッドは、エラーチェックに関係なく、またはコマンドが正常に実行された場合でも、コマンドを実行するためだけに使用される静的なルートレベルのシェルを作成します。
LEDをさまざまなレベルの明るさに設定できる、作成したAndroid懐中電灯アプリを使用しています。すべてのエラー チェックやその他の綿毛を取り除くことで、LED をわずか 3 ミリ秒で指定された明るさのレベルに切り替えることができます。アプリ自体の詳細については、http: //forum.xda-developers.com/showthread.php?t=2659842を参照してください。
以下はクラス全体です。
public class Shell {
private static Shell rootShell = null;
private final Process proc;
private final OutputStreamWriter writer;
private Shell(String cmd) throws IOException {
this.proc = new ProcessBuilder(cmd).redirectErrorStream(true).start();
this.writer = new OutputStreamWriter(this.proc.getOutputStream(), "UTF-8");
}
public void cmd(String command) {
try {
writer.write(command+'\n');
writer.flush();
} catch (IOException e) { }
}
public void close() {
try {
if (writer != null) { writer.close();
if(proc != null) { proc.destroy(); }
}
} catch (IOException ignore) {}
}
public static void exec(String command) { Shell.get().cmd(command); }
public static Shell get() {
if (Shell.rootShell == null) {
while (Shell.rootShell == null) {
try { Shell.rootShell = new Shell("su"); //Open with Root Privileges
} catch (IOException e) { }
}
}
return Shell.rootShell;
}
}
次に、アプリ内の任意の場所で、たとえば LED の明るさを変更するなどのコマンドを実行するために、次のように呼び出します。
Shell.exec("echo " + bt.getLevel() + " > "+ flashfile);
戻り値を気にしない場合は、そのまま使用できますRuntime.getRuntime().exec("path.to.your.batch.file");
単純にRuntime.exec()を使用できます