一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 調(diào)用java.lang.Runtime.exec的正確姿勢分享

調(diào)用java.lang.Runtime.exec的正確姿勢分享

2022-03-10 00:44Morpheus丶 Java教程

這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

調(diào)用java.lang.Runtime.exec的正確姿勢

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

在調(diào)用

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

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

而到了

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

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

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

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

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

 

兩種方法

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

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

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

?
1
2
3
4
5
6
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ā)現(xiàn)其重載方法4.exec(String []cmdarray) 最簡便適合我們,官方說4.exec() 與執(zhí)行6.exec(cmdarray,null,null) 效果是一樣的。那么5.exec.(cmdarray,null)也是一樣的咯?

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

?
1
2
3
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 中去,比如:

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

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

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

當(dāng)然echo , ls 等命令便不受' / '限制了。

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

 

小結(jié)一下

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

例如:

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

應(yīng)改為:

?
1
2
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() 有四種調(diào)用方法

?
1
2
3
4
* 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()函數(shù),比如

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

 

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

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

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

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

 

4.Runtime.exec()

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

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

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

?
1
javap -l xxx > output.txt

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/timo1160139211/article/details/75006938

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 百合漫画咱啪全彩抚慰 | 国产成人高清精品免费5388密 | 久久综合久久伊人 | 欧美va在线播放免费观看 | 日韩一级生活片 | 波多野结衣在线观看视频 | 欧美精品久久一区二区三区 | 亚洲精品一区波多野结衣 | 欧美va在线观看 | 免费一级特黄特色大片∵黄 | 亚洲国产精品无码中文字满 | 免费国产影视观看网站入口 | 999久久精品国产 | 91啦在线播放 | 日本一区二区视频在线 | 无码欧美喷潮福利XXXX | 成人私人影院在线版 | 国产高清不卡码一区二区三区 | 好深快点再快点好爽视频 | 嘿嘿午夜 | 久久久无码精品无码国产人妻丝瓜 | 美女露全身永久免费网站 | 3p文两男一女办公室高h | 成人香蕉xxxxxxx | 国产一及毛片 | a级黄色视屏 | 情侣奴伺候女王第2部分小说 | 亚洲国产日韩欧美mv | 国产一区二区在线免费观看 | 国产在线观看色 | 国产成人精品一区二三区 | 国产精品毛片高清在线完整版 | 调教女秘书 | 日本精品一区二区在线播放 | 欧美日韩亚洲第一区在线 | 亚洲天堂日韩在线 | 亚洲第一男人网站 | 亚洲国产成人精品无码区5566 | 欧美日韩视频一区三区二区 | 91se精品免费观看 | 91粉色视频在线导航 |