【问题标题】:Call a C executable with input and output redirection from Java从 Java 调用具有输入和输出重定向的 C 可执行文件
【发布时间】:2018-04-22 00:42:24
【问题描述】:

我有以下文件夹结构:

  • 项目
    • 词法分析器
      • 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", "&lt;", path, "&gt;", "output.txt"};它说找不到文件。我怎样才能做到这一点?

我也在我的终端上做了这个

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

但这不适用于 Java。

【问题讨论】:

  • Call c function from Java的可能重复
  • 恕我直言,它可能是重复的,但不是上述问题。 AFAIK,ProcessBuilder 不会自动从“”生成输入/输出重定向。这是一个外壳功能。您必须从 Java 管理 Streams,或者调用执行重定向的 shell 脚本。该脚本可以使用 'path' 参数化为 $1,这应该是最简单的解决方案。

标签: java c macos process


【解决方案1】:

使用&lt;&gt; 的输入和输出重定向由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"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2023-03-24
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多