從java程式中呼叫其它程式 (轉)
從中其它程式
tips/1999/tt1214.html">http://developer.java.sun.com/developer/TechTips/1999/tt1214.html 討論了 (Remote Method Invocation,方法呼叫)如何用於程式間通訊,另一個用於通訊的技術是Runtime.exec() 方法。你可以用這個方法從一個執行阿java程式中呼叫另一個程式。Runtime.exec 也允許你和程式相關的操作,例如控制程式的標準輸入輸出,等待程式的結束並得到它的退出狀態。下面是一個簡單的C程式,用來說明這些特性:
:namespace prefix = o ns = "urn:schemas--com::office" />
#include
int main() {
printf("testingn");
return 0;
}
這個程式寫字串"testing"到標準輸出,然後用退出狀態0終止程式。
為了在java程式中執行這個簡單的程式,先編譯這個c程式:
$ cc test.c -o test
(譯者注:對於,可以用gcc test.c –o test,對應使用者可以用相應的c語言編譯程式編譯成可執行程式test.exe)
(你的 C 可能要求不同的引數)然後使用下面的程式碼呼叫那個程式:
import java.io.*;
import java.util.ArrayList;
public class ExecDemo {
static public String[] runCommand(String cmd)
throws IOException {
// set up list to capture command output lines
ArrayList list = new ArrayList();
// start command running
Process proc = Runtime.getRuntime().exec(cmd);
/**譯者注:前面的宣告應該改成java.lang.Process,即:
java.lang.Process proc = Runtime.getRuntime().exec(cmd);
如果不改的話可能編譯不同透過,在譯者的機器上使用1.2,編譯出現5個錯誤
使用jdk1.4編譯出現4個錯誤
*/
// get command's output stream and
// put a buffered reader input stream on it
InputStream istr = proc.getInputStream();
BufferedReader br =
new BufferedReader(new InputStreamReader(istr));
// read output lines from command
String str;
while ((str = br.readLine()) != null)
list.add(str);
// wait for command to terminate
try {
proc.waitFor();
}
catch (InterruptedException e) {
System.err.println("process was interrupted");
}
// check its exit value
if (proc.exitValue() != 0)
System.err.println("exit value was non-zero");
// close stream
br.close();
// return list of strings to caller
return (String[])list.toArray(new String[0]);
}
public static void main(String args[]) throws IOException {
try {
// run a command
String outlist[] = runCommand("test");
// display its output
for (int i = 0; i < outlist.length; i++)
System.out.println(outlist[i]);
}
catch (IOException e) {
System.err.println(e);
}
}
}
演示程式呼叫方法runCommand 實際執行程式。
String outlist[] = runCommand("test");
這個方法使用一個輸入流鉤取程式的輸出流,因此它可以讀取程式的輸出,然後將之存入一個字串列表。
InputStream istr = proc.getInputStream();
BufferedReader br =
new BufferedReader(new InputStreamReader(istr));
String str;
while ((str = br.readLine()) != null)
list.add(str);
在所有的輸出都被讀取後,呼叫waitFor 等待程式終止,然後呼叫exitValue 讀取程式的退出狀態值。如果你做過很多的話,例如系統呼叫,這個方法你應該很熟悉。(這個例子假設當前路徑包含在你的的執行路徑上)。
如果你使用UNIX系統,你可以用:
runCommand("ls -l");
代替:
runCommand("test");
(譯者注:一個更為通用的就是runCommand("java");,譯者使用runCommand("dir");在下得到的結果是程式IO異常,在linux系統下沒有測試過。)
得到當前路徑下的所有的長列表。但是用這個辦法得到列表突出了使用Runtime.exec 的一個基本的弱點――你呼叫的程式變成不可移植的。也就是說,Runtime.exec 是可移植的,在不同的java實現中都存在,但是被呼叫程式不一定是這樣的,在Windows系統下沒有程式叫"ls" 。
假設你執行 而你決定使用
runCommand("dir");
糾正這個問題,"dir" 是"ls" 的等同的命令。這不能工作,因為"dir" 不是一個可執行程式。它內建於shell (命令直譯器) CMD.EXE。因此你應當使用:
runCommand("cmd /c dir");
這裡 "cmd /c command" 是 "呼叫shell 並執行指定的命令並退出。" 類似的,對於一個UNIX shell ,例如Korn shell,你可能應該用:
runCommand("ksh -c alias");
這裡 "alias" 是shell 的內建命令。在這個情況下的輸出是shell 的別名的列表。
在上面獲取目錄列表的例子中,你可以用可移植的java程式到達相同的結果。例如:
import java.io.File;
public class DumpFiles {
public static void main(String args[]) {
String list[] = new File(".").list();
for (int i = 0; i < list.length; i++)
System.out.println(list[i]);
}
}
給出當前目錄下所有檔案和目錄的列表。因此在大多情況下,使用ls/dir 可能沒有意義。
使使用Runtime.exec有意義的一個情況就是允許使用者指定一個編輯器或者文書處理程式(就像Emacs 或者 Vi 或者) 編輯檔案。這是大型程式的一個通常的特性。程式將有一個檔案指定編輯器的本地路徑,然後使用這個路徑呼叫Runtime.exec。
Runtime.exec 的一個微妙的地方就是它如何查詢檔案。例如,你使用:
Runtime.exec("ls");
那麼"ls" 如何被找到呢?在JDK 1.2.2 上的試驗表明是搜尋PATH 環境變數。這就像你在shell中執行命令時所發生的情況。但是文件中並沒有說明這點,因此應該小心使用。你不能假設搜尋路徑已經設定。就像上面討論的那樣在有限的方式上使用Runtime.exec 可能更有意義,使用絕對路徑。
也有不同的Runtime.exec 允許你指定環境字串陣列。(譯者注:具體方式請參看文件)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從 C/C++ 程式呼叫 Java 程式碼C++Java
- 在python程式中呼叫java程式碼PythonJava
- JNI:Java程式碼呼叫原生程式碼Java
- Java魔法堂:呼叫外部程式Java
- java呼叫python程式碼JavaPython
- java學習:Java中的其它類Java
- Java程式呼叫kettle中的job(.kjb)和Trans(.ktr)Java
- Python 指令碼中呼叫 Java 程式時 Classpath 錯誤Python指令碼Java
- elasticsearch之Java呼叫原生程式碼ElasticsearchJava
- Java呼叫本地可執行程式Java行程
- React轉微信小程式:從React類定義到Component呼叫React微信小程式
- Framer 指南:從設計到程式設計、元件及其它程式設計元件
- 微信小程式使用其它字型微信小程式
- 一個JAVA程式呼叫外部程式的問題!(急)Java
- 從 Java 程式碼到 Java 堆Java
- 效能分析之CPU分析-從CPU呼叫高到具體程式碼行(JAVA)Java
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java程式中的多執行緒(2)(轉)Java執行緒
- 在Java中實現遠端方法呼叫(轉)Java
- PHP中呼叫JAVA,PHPJava
- 怎麼從初、中級Java程式設計師過渡到高階Java程式設計師?Java程式設計師
- java程式中編譯另一個java程式Java編譯
- 用跨程式子類化技術實現對其它程式訊息的攔載 (轉)
- 從 XML 到 Java 程式碼的資料繫結(1)(轉)XMLJava
- java 程式碼格式(轉)Java
- java使用程式塊(轉)Java
- Vector在Java程式設計中的應用 (轉)Java程式設計
- Java中的非同步網路程式設計 (轉)Java非同步程式設計
- Java如何呼叫C語言程式,JNI技術JavaC語言
- 高質量C++/C程式設計指南(第11章 其它程式設計經驗) (轉)C++C程式程式設計
- DirectX5.0最新遊戲程式設計指南 DirectDraw教程篇 五、DirectDraw中其它的DirectDraw範例 (轉)遊戲程式設計
- java中呼叫npm模組JavaNPM
- [轉]從程式號找到IP地址
- 基礎:全面保護你的Java程式安全(中)(轉)Java
- Java程式中除錯Python程式方法Java除錯Python
- Java程式的反加密(轉)Java加密
- python中怎麼呼叫另一個程式Python
- java程式通過swing呼叫javaFx更新 資料Java