java.lang.Runtime.execの正しい姿勢を呼び出します。
2751 ワード
今日はコンパイルを使うプログラムを書きましたが、問題がありました。は、runtime.exec(「javac Hello World.java」)を呼び出しています。完璧な運行、つまり生成があります。クラスです。 で、runtime.execに着きました。どうしても出力をリダイレクトできず、output.txtファイルも生成できませんでした。 「echo hello」をテストしてもいいです。1.txt」もいけません。頭が痛くて、資料を閲覧して、やっと を発見しました。の認識上の誤りは、exec(str)の中でstrを完全にコマンドライン実行のcommandと見なしてはいけないということです。特に、strにはリダイレクト''''''''とコンジット'とが含まれてはいけない。 じゃ、このような指令があったらどうすればいいですか?私達は引き続き下を見ます。 二つの方法:は、コマンドをスクリプトに書き込み、runtime.exec()でスクリプトを呼び出します。この方法はexec()を使うことを避けました。考え方も一つです。 もう一つの方法があります。exec()の積載方法を呼び出します。この方法を重点的に見ます。 まずオフィシャルdoc[>linkを見ます。です。そう書いてもいいです。 runtime.exec(new String[]{///bin/bash]、「-c」、「java Hello World>>output.txt」);
runtime.exec(newString[]“/bin/bash”、“-c”、“java Hello World”>output.txt”);
runtime.exec(newString[]、「/bin/bash」、「-c」、「java Hello World」>>output.txt」}、null、null);
ただし、java/home/path/Hello Worldを使用すると、'/'は「.」と解析され、「エラー:見つけられないか、ホストクラスをロードできないか、home.path.Hello World」と報告されます。
したがって、全パスが使えない場合は、ポリシーを変更して、作業ディレクトリdirにパスを変更します。
File dir=new File("/home/path/")
その後、その第6の重積載方法で、dirを第3のパラメータとして渡せば良いです。
String[]cmdarry={"/bin/bash"、-c"、''java Hello World>>output.txt'
runtime.exec(cmdarry,null.dir)
もちろんecho、lsなどの命令は'/'の制限を受けません。
*BTW,exec()戻り値を取得する標準的な使い方は、runtime.exec()の左腕の右腕です。http://blog.csdn.net/timo1160139211/article/details/75050886
まとめ:コマンドにリダイレクト''''''とコンジット'が含まれている場合、exec(String command)メソッドは適用されなくなり、exec(String[]cmdAray)またはexec(String[]cmdarray,String envp,Fidir)を使用して実行される必要があります。
たとえば: exec(「echo hello」ouput.txt)、 exec(「history grep-i mvn」)、 変更するべきです exec(newString[]]“/bin/sh”、“-c”、“echo hello”>ouput.txt”); exec(newString[]{/bin/bash]、「-c」、「history grep-i mvn」}、null); 参考資料:
https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
http://blog.csdn.net/flying881114/article/details/6272472
http://blog.csdn.net/westwin/article/details/358377
http://blog.csdn.net/moreorless/article/details/4182883
1. public Process exec(String command) throws IOExecption
2. public Process exec(String command,String [] envp) throws IOExecption
3. public Process exec(String command,String [] envp,File dir) throws IOExecption
4. public Process exec(String[] cmdarray) throws IOExecption
5. public Process exec(String[] cmdarray,String [] envp) throws IOExecption
6. public Process exec(String[] cmdarray,String [] envp,File dir) throws IOExecption
文書を見てみると、重いロード方法は4.execが一番簡単で、私達に似合います。公式によると、4.exec()は6.exc(cmdarray、null、null)と同じです。5.exc.(cmdarray、null)も同じです。runtime.exec(newString[]“/bin/bash”、“-c”、“java Hello World”>output.txt”);
runtime.exec(newString[]、「/bin/bash」、「-c」、「java Hello World」>>output.txt」}、null、null);
ただし、java/home/path/Hello Worldを使用すると、'/'は「.」と解析され、「エラー:見つけられないか、ホストクラスをロードできないか、home.path.Hello World」と報告されます。
したがって、全パスが使えない場合は、ポリシーを変更して、作業ディレクトリdirにパスを変更します。
File dir=new File("/home/path/")
その後、その第6の重積載方法で、dirを第3のパラメータとして渡せば良いです。
String[]cmdarry={"/bin/bash"、-c"、''java Hello World>>output.txt'
runtime.exec(cmdarry,null.dir)
もちろんecho、lsなどの命令は'/'の制限を受けません。
*BTW,exec()戻り値を取得する標準的な使い方は、runtime.exec()の左腕の右腕です。http://blog.csdn.net/timo1160139211/article/details/75050886
まとめ:
たとえば:
https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
http://blog.csdn.net/flying881114/article/details/6272472
http://blog.csdn.net/westwin/article/details/358377
http://blog.csdn.net/moreorless/article/details/4182883