溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么正確調用java.lang.Runtime.exec

發(fā)布時間:2021-11-03 13:35:07 來源:億速云 閱讀:145 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“怎么正確調用java.lang.Runtime.exec”,在日常操作中,相信很多人在怎么正確調用java.lang.Runtime.exec問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么正確調用java.lang.Runtime.exec”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

調用java.lang.Runtime.exec的正確姿勢

今天寫一個用到編譯的程序,遇到了問題。

在調用

runtime.exec("javac HelloWorld.java");

運行完美,也就是有生成.class。

而到了

runtime.exec("java HelloWorld >> output.txt");

卻怎么也無法重定向輸出,連output.txt文件也生成不了。

測試"echo hello >> 1.txt" 也是不可以,甚是頭疼,于是乎翻閱資料,這才發(fā)現了

一個認識上的誤區(qū),就是exec(str)中 不能把str完全看作命令行執(zhí)行的command。尤其是str中不可包含重定向 ' < ' ' > ' 和管道符' | ' 。

那么,遇到這樣的指令怎么辦呢?我們接著往下看:

兩種方法

一種是將指令寫到腳本中,在runtime.exec()中調用腳本。這種方法避過了使用exec(),也是一種思路。

還有一種方法,就是調用exec()的重載方法:我們來重點看這種方法:

我們先看一下官方doc[>link<]給我們提供的重載方法:

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

翻閱其文檔,發(fā)現其重載方法4.exec(String []cmdarray) 最簡便適合我們,官方說4.exec() 與執(zhí)行6.exec(cmdarray,null,null) 效果是一樣的。那么5.exec.(cmdarray,null)也是一樣的咯?

于是乎,我們可以這樣寫:

runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} );
runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} ,null );
runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} ,null,null );

不過要注意,如果使用java /home/path/HelloWorld 時,' / '會被解析成 " . ",從而報出 “錯誤: 找不到或無法加載主類 .home.path.HelloWorld ”.

所以,無法使用全路徑的時候,我們需要更改一下策略,把 路徑 改到工作目錄dir 中去,比如:

File dir = new File("/home/path/");

然后用其第6種重載方法,把dir作為第三個參數傳入即可:

String []cmdarry ={"/bin/bash", "-c", "java HelloWorld >> output.txt"}
runtime.exec(cmdarry,null.dir);

當然echo , ls 等命令便不受' / '限制了。

*BTW,exec()取得返回值的標準用法詳見:runtime.exec()的左膀右臂

小結一下

當命令中包含重定向 ' < ' ' > ' 和管道符' | ' 時,exec(String command)方法便不適用了,需要使用exec(String [] cmdArray) 或者exec(String []cmdarray,String []envp,File dir)來執(zhí)行。

例如:

exec("echo hello >> ouput.txt");
exec("history | grep -i mvn");

應改為:

exec( new String[]{"/bin/sh","-c","echo hello >> ouput.txt"});
exec( new String[]{"/bin/bash","-c","history | grep -i mvn"},null);

Java Runtime.exec()注意事項

  • Runtime.exec()用來執(zhí)行外部程序或命令

1.Runtime.exec() 有四種調用方法

* public Process exec(String command);
    * public Process exec(String [] cmdArray);
    * public Process exec(String command, String [] envp);
    * public Process exec(String [] cmdArray, String [] envp);

2.得到程序執(zhí)行返回值, 0為success

需要用waitFor()函數,比如

Process p = Runtime.getRuntime().exec("javac");
(處理.....)
int exitVal = p.waitFor();

3.得到程序執(zhí)行的結果或錯誤信息

需要用BufferedInputStream 和 BufferReader來得到,否則程序會hang

比如得到錯誤信息用p.getErrorStream(),然后輸出即可:

BufferedInputStream in = new BufferedInputStream(p.getErrorStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));

4.Runtime.exec()

不等同于直接執(zhí)行command line命令

啊,我算是在這里吃了苦頭了。Runtime.exec()很有局限性,對有些命令不能直接把command line里的內容當作String參數傳給exec().

比如重定向等命令。舉個例子:

javap -l xxx > output.txt

這時要用到exec的第二種重載,即input 參數為String[]:

Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","javap -l xxx > output.txt"});

到此,關于“怎么正確調用java.lang.Runtime.exec”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI