使用Java的流程构建器来调用C程序
尝试使用Java的流程构建器调用C程序,但不知道在流程构建器调用中调用什么。
Process p = new ProcessBuilder("myCommand", "myArg").start();
对于myCommand
和myArg
,我将用什么值替换它来运行C程序? 我希望它调用的程序如下所示:
calculator.c:
#include int main () { int a = 4; int b = 2; int c = a + b; printf("Result: %d \n", c); }
如果还没有编译calculator.c,你需要先编译它:
Process compile = new ProcessBuilder("gcc", "calculator.c").start(); Process execute = new ProcessBuilder("./a.out").start();
任何相关的编译器标志(例如, -O
或-o calculator
)也应该包含在参数中。 如果您重命名可执行文件,则需要使用它更改./a.out
。
更好的方法(就少数硬编码常量而言)是有一些变量,如:
String c_file = "calculator.c"; String output_exe = "calculator"; Process compile = new ProcessBuilder("gcc", "-o " + output_exe, c_file).start(); Process execute = new ProcessBuilder("./" + output_exe);
最后,您可能希望确保每个进程都正在退出而不会出现错误:
if (compile.getInputStream().read() == -1) { // that means something was written to stderr, and you can do something like System.out.error("ERROR!"); System.exit(-1); }
正如@VinayDandekar指出的那样,你也可以使用exitValue
来做到这一点。
if (compile.exitValue() == -1) { // that means something was written to stderr, and you can do something like System.out.error("ERROR!"); System.exit(-1); }
首先在Windows系统属性上设置环境变量的编译器路径否则它将无法工作。 然后设置编译并运行代码
编译代码:`
JFileChooser fileChooser=new JFileChooser(); if (fileChooser.showSaveDialog(compile.this) != JFileChooser.APPROVE_OPTION) return; File file = fileChooser.getSelectedFile(); try { FileWriter out = new FileWriter(file); textEditor.write(out); out.close(); } catch (IOException e1) { e1.printStackTrace(); } String filepath = file.getPath(); String filepath2 = filepath.substring(0, filepath.lastIndexOf(File.separator)); System.out.println(filepath); System.out.println(filepath2); String name = file.getName(); String name2 = file.getName().substring(0, file.getName().lastIndexOf(".")); String folder = filepath2+"\\"; String exe = folder+name2+".exe"; System.out.println(exe); ProcessBuilder pb=new ProcessBuilder(); try { pb = new ProcessBuilder("cmd", "/C", "gcc " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\""); pb = new ProcessBuilder("cmd", "/C", "g++ " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\""); pb.directory(new File(filepath2)); Process p = pb.start(); p.waitFor(); int x = p.exitValue(); if (x == 0) { area.setForeground(red); area.setText(" == 0 error.. Compilation Finished"); } else { BufferedReader r = new BufferedReader(new InputStreamReader(p.getErrorStream())); //BufferedWriter rm=new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); String out; area.setText(""); while ((out = r.readLine()) != null) { area.setForeground(RED); area.append(out + System.getProperty("line.separator")); } } } catch (Exception ex) { ex.printStackTrace(); }
`
运行代码:`
JFileChooser fileChooser=new JFileChooser(); if (fileChooser.showSaveDialog(compile.this) != JFileChooser.APPROVE_OPTION) return; File file = fileChooser.getSelectedFile(); try { FileWriter out = new FileWriter(file); textEditor.write(out); out.close(); } catch (IOException e1) { e1.printStackTrace(); } String filepath = file.getPath(); String filepath2 = filepath.substring(0, filepath.lastIndexOf(File.separator)); System.out.println(filepath); System.out.println(filepath2); String name = file.getName(); String name2 = file.getName().substring(0, file.getName().lastIndexOf(".")); String folder = filepath2+"\\"; String exe = folder+name2+".exe"; System.out.println(exe); ProcessBuilder pb=new ProcessBuilder(); try { pb = new ProcessBuilder("cmd", "/C", "gcc " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\""); pb = new ProcessBuilder("cmd", "/C", "g++ " + "\"" + filepath2 + "\\" + name + "\"" + " -o \"" + name2+"\""); pb.directory(new File(filepath2)); Process p = pb.start(); p.waitFor(); int x = p.exitValue(); int z=p.exitValue(); if (x == 0) { Runtime rt = Runtime.getRuntime(); try { String username = System.getProperty("user.name"); String c = "@echo off\n" + "\"" + filepath2 + "\\" + name2 + ".exe\"\n" + "echo.\n" + "echo.\n" + "echo Process Terminated\n" + "pause\n" + "exit"; File dir = new File("C:\\Users\\" + username + "\\CodeEditor"); dir.mkdir(); try { File file2 = new File("C:\\Users\\" + username + "\\CodeEditor" + "\\run.bat"); file2.createNewFile(); PrintWriter writer = new PrintWriter(file2); writer.println(c); writer.close(); Process p2 = Runtime.getRuntime().exec("cmd /c start run.bat", null, new File("C:\\Users\\" + username + "\\CodeEditor")); } catch (Exception ex) { } } catch (Exception ex) { } } else { JOptionPane.showMessageDialog(compile.this, "Compilation Error", "Error", JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) { ex.printStackTrace(); }
`
完成!
运行时可用于执行OS支持的任何命令行指令。
以下示例将有所帮助。
package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class CommandExec { public static void main(String[] args) { try { Process pr = Runtime.getRuntime().exec("ls /etc"); BufferedReader read = new BufferedReader(new InputStreamReader(pr.getInputStream())); String str = read.readLine(); while (str != null){ System.out.println(str); str = read.readLine(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}