web-dev-qa-db-ja.com

Javaでコマンドラインを実行する

Javaアプリケーション内でこのコマンドラインを実行する方法はありますか?

Java -jar map.jar time.rel test.txt debug

コマンドで実行できますが、Java内では実行できませんでした。

114
Ataman
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("Java -jar map.jar time.rel test.txt debug");

http://docs.Oracle.com/javase/7/docs/api/Java/lang/Runtime.html

172
kol

次のような出力も見ることができます。

final Process p = Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");

new Thread(new Runnable() {
    public void run() {
     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
     String line = null; 

     try {
        while ((line = input.readLine()) != null)
            System.out.println(line);
     } catch (IOException e) {
            e.printStackTrace();
     }
    }
}).start();

p.waitFor();

また、Windowsで実行している場合は、コマンドの前に「cmd/c」を置く必要があることを忘れないでください。

47
Craigo

標準出力および/またはエラーで大量のデータを出力する場合に呼び出されるプロセスがブロックされるのを回避するには、Craigoが提供するソリューションを使用する必要があります。また、ProcessBuilderはRuntime.getRuntime()。exec()よりも優れていることに注意してください。これにはいくつかの理由があります。引数をトークン化し、エラーの標準出力も処理します( here も確認してください)。

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...);
builder.redirectErrorStream(true);
final Process process = builder.start();

// Watch the process
watch(process);

新しい関数「ウォッチ」を使用して、このデータを新しいスレッドに収集します。このスレッドは、呼び出されたプロセスが終了すると、呼び出しプロセスで終了します。

private static void watch(final Process process) {
    new Thread() {
        public void run() {
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null; 
            try {
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}
17
mountrix
import Java.io.*;

Process p = Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");

さらに問題が発生した場合は、次のことを考慮してください。ただし、上記の方法でうまくいくと思います。

Runtime.exec()の問題

8
Shaun
Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");
7
Igor Popov

どう?

public class CmdExec {

public static Scanner s = null;


public static void main(String[] args) throws InterruptedException, IOException {
    s = new Scanner(System.in);
    System.out.print("$ ");
    String cmd = s.nextLine();
    final Process p = Runtime.getRuntime().exec(cmd);

    new Thread(new Runnable() {
        public void run() {
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null; 

            try {
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();

    p.waitFor();
     }

 }
4
Denis
Process p = Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug");
3

Runtimeクラス内でexecコマンドを試しましたか?

Runtime.getRuntime().exec("Java -jar map.jar time.rel test.txt debug")

ランタイム-Javaドキュメント

3
rybosome