呼叫 C
外觀
| 導航 高階 主題: |
您可以使用 Runtime.exec() 方法在執行的 Java 應用程式中呼叫程式。Runtime.exec() 還允許您對程式執行操作,例如控制程式的標準輸入和輸出,等待其完成執行,以及獲取其退出狀態。
這是一個簡單的 C 應用程式,說明了這些功能。此 C 程式將從 Java 中呼叫
#include <stdio.h>
int main() {
printf("testing\n");
return 0;
}
此應用程式將字串“testing”寫入標準輸出,然後以 0 的退出狀態終止。要執行此簡單程式,請在 Java 應用程式中編譯 C 應用程式。
編譯
$ cc test.c -o test |
然後使用以下 Java 程式碼呼叫 C 程式
程式碼清單 10.2:呼叫 C 程式。
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InterruptedException;
import java.io.Process;
import java.io.Runtime;
import java.util.ArrayList;
public class ExecDemo {
public static 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);
// --- 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 來實際執行程式。
程式碼部分 10.1:執行命令。
String outlist[] = runCommand("test");
|
此方法將輸入流掛鉤到程式的輸出流,以便它可以讀取程式的輸出,並將其儲存到一個字串列表中。
程式碼部分 10.2:讀取程式的輸出。
InputStream istr = proc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(istr));
String str;
while ((str = br.readLine()) != null) {
list.add(str);
}
|
存在工具可以幫助將現有專案從 C 遷移到 Java。一般來說,自動翻譯工具分為兩種不同的型別
- 一種將 C 程式碼轉換為 Java 位元組碼。它基本上是一個建立位元組碼的編譯器。它與任何其他 C 編譯器具有相同的步驟。另見 C 到 Java JVM 編譯器.
- 另一種將 C 程式碼轉換為 Java 原始碼。這種型別更復雜,並使用各種語法規則來建立可讀的 Java 原始碼。對於希望將 C 程式碼遷移到 Java 並留在 Java 中的人來說,此選項是最好的。
