使用Java的输入和输出重定向调用C可执行文件

时间:2018-04-22 00:42:24

标签: java c macos process

我有以下文件夹结构:

  • 项目
    • 词法
      • mylexer(这是一个C可执行程序)
  • 分析器
    • MyJavaFile.java

从解析器中的java文件中我想执行mylexer程序并等待结果。 我有以下代码:

public static String getTokensFromFile(String path) {
    String s = null;
    StringBuilder sb = new StringBuilder(path);
    try {
        Runtime rt = Runtime.getRuntime();
        String[] command = {"mylexer", "<", path, ">", "output.txt"};
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.directory(new File("../Lexer"));
        Process pr = pb.start();
        BufferedReader stdInput = new BufferedReader(new
             InputStreamReader(pr.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
             InputStreamReader(pr.getErrorStream()));
        while ((s = stdError.readLine()) != null) {
            sb.append(s+"\n");
        }
    }catch(Exception e) {
        System.out.println(e);
    }
    return (sb.toString().length() > 0)? sb.toString() : "";
}

我没有得到任何结果,程序永远不会结束执行,如果我这样做String[] command = {"./mylexer", "<", path, ">", "output.txt"};它说找不到文件。我怎样才能做到这一点?

我也在终端上做了这个

../Lexer/mylexer < /Users/jacobotapia/Documents/Compiladores/Proyecto/Lexer/sample.txt > output.txt 

但这不适用于Java。

1 个答案:

答案 0 :(得分:2)

使用<>的输入和输出重定向由shell执行(sh,bash或您正在使用的任何内容)。除非您从ProcessBuilder调用shell,否则它们在ProcessBuilder中不具有此语法。

但是,ProcessBuilder自行支持重定向使用redirectInputredirectOutput方法启动的进程的输入和输出。以下内容适用于您:

String[] command = {"mylexer"};
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectInput(new File(path));
pb.redirectOutput(new File("output.txt"));