從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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在python程式中呼叫java程式碼PythonJava
- JNI:Java程式碼呼叫原生程式碼Java
- Java魔法堂:呼叫外部程式Java
- React轉微信小程式:從React類定義到Component呼叫React微信小程式
- Python 指令碼中呼叫 Java 程式時 Classpath 錯誤Python指令碼Java
- elasticsearch之Java呼叫原生程式碼ElasticsearchJava
- java學習:Java中的其它類Java
- 微信小程式使用其它字型微信小程式
- 效能分析之CPU分析-從CPU呼叫高到具體程式碼行(JAVA)Java
- 怎麼從初、中級Java程式設計師過渡到高階Java程式設計師?Java程式設計師
- java程式通過swing呼叫javaFx更新 資料Java
- Java如何呼叫C語言程式,JNI技術JavaC語言
- Java程式中除錯Python程式方法Java除錯Python
- python中怎麼呼叫另一個程式Python
- 在小程式後端中轉獲取介面資料,繞過前端呼叫限制後端前端
- lua呼叫c程式C程式
- 除了程式設計還有其它的要學程式設計
- 在linux系統中,手動編寫java程式碼,將介面打成jar供其他程式呼叫,實現方式LinuxJavaJAR
- C程式函式呼叫&系統呼叫C程式函式
- 用JAVA寫一個阿里雲VPC Open API呼叫程式Java阿里API
- AI來實現程式碼轉換!Python轉Java,Java轉Go不在話下?AIPythonJavaGo
- Java 中的程式碼塊Java
- Java中的程式碼塊Java
- 如何在 Deno 應用程式中呼叫 Rust 函式Rust函式
- java中呼叫npm模組JavaNPM
- Bug集錦-Spring Cloud Feign呼叫其它介面報錯SpringCloud
- Python與其它程式語言的差異化總結Python
- 音樂格式轉換:java程式碼實現Java
- C#/.net程式呼叫pythonC#Python
- C# 呼叫Python程式碼C#Python
- Oracle資料庫基礎:程式中呼叫sqlplus的方式Oracle資料庫SQL
- jmeter學習指南之Beanshell 呼叫 java 程式碼的三種方式JMeterBeanJava
- java呼叫window本地應用程式;讀取TXT型別檔案Java型別
- 在CMakeLists.txt中設定版本號,並在程式碼中呼叫
- 【轉】C# 中 強制退出WinForm程式C#ORM
- java中避免集合死鏈呼叫Java
- python BGE 模型轉換為onnx給java呼叫Python模型Java
- Rust中的範型程式設計-Exonum是如何從Iron轉移到Actix-webRust程式設計Web
- 容器中Java 程式OOMKilled原因淺析JavaOOM