调用 C
外观
< Java 编程
导航 高级 主题: ) |
您可以使用 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 中的人来说,此选项是最好的。