今天寫一個用到編譯的程序,遇到了問題。html
- 在調用runtime.exec("javac HelloWorld.java");運行完美,也就是有生成.class。
- 而到了runtime.exec("java HelloWorld >> output.txt");卻怎麼也沒法重定向輸出,連output.txt文件也生成不了。
- 測試"echo hello >> 1.txt" 也是不能夠,甚是頭疼,因而乎翻閱資料,這才發現了
- 一個認識上的誤區,就是exec(str)中 不能把str徹底看做命令行執行的command。尤爲是str中不可包含重定向 ' < ' ' > ' 和管道符' | ' 。
- 那麼,遇到這樣的指令怎麼辦呢?咱們接着往下看:
咱們先看一下官方doc[>link<]給咱們提供的重載方法:java
- 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(String []cmdarray) 最簡便適合咱們,官方說4.exec() 與執行6.exec(cmdarray,null,null) 效果是同樣的。那麼5.exec.(cmdarray,null)也是同樣的咯?api
- 因而乎,咱們能夠這樣寫:
runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} );bash
runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} ,null );oracle
runtime.exec( new String[]{"/bin/bash", "-c", "java HelloWorld >> output.txt"} ,null,null );測試
不過要注意,若是使用java /home/path/HelloWorld 時,' / '會被解析成 " . ",從而報出 「錯誤: 找不到或沒法加載主類 .home.path.HelloWorld 」.spa
因此,沒法使用全路徑的時候,咱們須要更改一下策略,把 路徑 改到工做目錄dir 中去,好比:.net
File dir = new File("/home/path/");命令行
而後用其第6種重載方法,把dir做爲第三個參數傳入便可:htm
String []cmdarry ={"/bin/bash", "-c", "java HelloWorld >> 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 [] cmdArray) 或者exec(String []cmdarray,String []envp,File dir)來執行。
例如:
- 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);