2017-06-02 17 views
1

私は以下のようにして、私のコンソールベースのJavaプログラムからEmacsエディタで特定のファイルを開くしようとしています:Runtime.getRuntime()。exec()経由でJavaからUnix端末テキストエディタを開く方法?

コマンドは二つの要素の文字列配列である
int exitValue = Runtime.getRuntime().exec(commands).waitFor(); 

commands[0] = "emacs"; 
commands[1] = "/home/test.txt"; // The actual path I'm using is different. 

これを実行すると、emacsは開きませんが、代わりに私のプログラムは実行を継続し、上記の行(最初の行)が実行された後にexitValueでが実行されます。私は間違って何をしていますか?

私が代わりにプログラムを実行し続ける、同じ目的のためにVIのいずれかのナノを使用してみた場合にも、ちょうどその行を実行した後がハングアップしますが、どちらのエディタが実際に開きます。

答えて

0

このプロセスでは、標準エラーでメッセージが出力されている可能性があります。標準エラーを読み取るには、ProcessオブジェクトのgetErrorStream()メソッドを呼び出し、返されたInputStreamから別のスレッドで読み取る必要があります。

音はむしろ関与していますか?

ProcessBuilder builder = new ProcessBuilder("emacs", "/home/test.txt"); 

// Makes Process use Java program’s stdin, stdout and stderr. 
builder.inheritIO(); 

int exitValue = builder.start().waitFor(); 

あなたのコマンドが作業することはありませんが、それはあなたが何を見ることができるようになります:それはプロセスの出力の視聴がはるかに簡単になりますRuntime.execのがProcessBuilderで年前に置き換えられた理由の一つであり、間違っている。

+0

これは私が必要とするものを正確に行います。ありがとうございました。 –

0

は簡単でなければならない:ちょうどVIを起動し、xtermのを除外:

Process p = new ProcessBuilder("vi", "/home/test.txt").start(); 

あなたはviのためのより多くのコマンドライン引数を使用する場合は、別の文字列としてではなく、「」最初の引数の内側に追加します。

viのような端末プログラムを起動するには、可視端末からJavaアプリケーションを起動する必要がありますので、viには端末を使用する必要がありますが、これはそうだと思います。

+0

ジョーがemacsの代わりにviを使うべきであると示唆して、トローリングしているのかどうかはわかりません。 – VGR

+0

これは違いはありません。以前とまったく同じように動作します。私がviを使うと、この行を実行したあとにハングするだけです。もしemacsを使うなら、実際に何もしませんが、次のコードに移ります。 –

関連する問題