代码之家  ›  专栏  ›  技术社区  ›  Jacobo

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

  •  0
  • Jacobo  · 技术社区  · 6 年前

    我有以下文件夹结构:

    • 项目
      • Lexer公司
        • 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 回复  |  直到 6 年前
        1
  •  2
  •   Erwin Bolwidt    6 年前

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

    然而,ProcessBuilder支持重定向使用 redirectInput redirectOutput 方法。以下内容应适用于您:

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