【问题标题】:Run C++ program using Java使用 Java 运行 C++ 程序
【发布时间】:2011-07-10 10:41:47
【问题描述】:

我创建了一个 Java 程序,它将使用 C++ 程序处理文件。这是调用C++程序的部分代码:

公共静态布尔 buildPAKFile(字符串 OSMFile){ log("开始为 " + OSMFile + "..." 构建 PAK 文件); // 获取 OSMFile 的名称 String[] OSMFileName = OSMFile.split("\\."); 尝试 { 运行时 rt = Runtime.getRuntime(); 进程 pr = rt.exec("cat " + OSMFile + " | ../gosmore rebuild " + OSMFileName[0]); /* BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 字符串行=空; while((line=input.readLine()) != null) { System.out.println(line); }*/ int exitVal = pr.waitFor(); System.out.println("退出,错误码"+exitVal); } 捕捉(异常 e){ System.out.println(e.toString()); e.printStackTrace(); } log("完成为 " + OSMFile 构建 PAK 文件); 返回真; }

当我取消注释从 C++ 程序打印输入流的部分时,出现乱码文本。我怎样才能正确地做到这一点?谢谢!

添加:

这是执行命令的示例:

猫 ncr-sample.osm | ../gosmore 重建 ncr-sample.pak 使用样式 /usr/local/share/gosmore/elemstyles.xml 构建 ncr-sample.pak... ../gosmore 属于公共领域,不提供任何担保 ... 484 for (pairs = 0; pairs

【问题讨论】:

  • try: PrintStream out = new PrintStream(System.out, true, "UTF-8"); out.println(line); 这将强制编码为 UTF-8.. 你也可以尝试不同的编码。
  • 在 Java 代码之外运行 C++ 程序会输出什么?
  • @Matt 完整的命令是“cat file.osm | ../gosmore rebuild file.pak”。此命令将内容传递给“gosmore”应用程序,该应用程序依次重建它(“rebuild”参数)以形成一个名为 file.pak 的 PAK 文件。
  • ...但是执行时输出(特别是到标准输出)是什么?
  • @Matt 它打印 c++ 程序的正在进行的进程。之后,生成 PAK 文件。

标签: java c++ linux command-line


【解决方案1】:

我见过this beforeRuntime.exec() 不会生成 shell,因此无法处理 shell 重定向字符,例如 |。您正在运行的唯一命令是初始的cat。要解决此问题,请将 XML 文件传递​​到子进程的标准输入中,或者将链包装到 shell 脚本中。

【讨论】:

  • “要么将 XML 文件传递​​到子进程的标准输入”是什么意思?如果我将命令包装到 shell scipt?我可以在那里传递参数吗?
  • 我不太了解gosmore,不知道你能否说服它通过其他方式接受输入。您当前正在运行一个使用cat 命令读取XML 文件并将其写入gosmore 的标准输入的shell 管道。您的 Java 代码可以改为从 OSMFile 读取数据并将其写入 pr.getOutputStream()
  • 这是一个不同的例子,它明确地使用一个子外壳来处理管道:devdaily.com/java/java-exec-system-command-pipeline-pipe
  • 感谢您的回答。我想检查一下,但我需要一个更清晰的答案,以使阅读此页面的人受益。但我+1。我会尝试在这里给出我自己的答案(根据我的发现)。
【解决方案2】:

我在@Adrian Cox 的帮助下发现正确的实现应该是这样的:

String gosmoreCmd = " cat " + OSMFile + " | ../gosmore rebuild"     
                    + OSMFileName[0] + ".pak";
String[] cmds = {"/bin/bash", "-c", gosmoreCmd};
Process pr = rt.exec(cmds);

/bin/bash 运行外壳程序,使用 -c 参数,您可以将新命令传递给此外壳程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多