我已经创建了一个Process Builder。如何在“进程”构建器中运行所有程序?

时间:2018-03-26 02:15:01

标签: java processbuilder

Heere是我到目前为止的代码。我如何运行miktex-pdftex?

List<String> processes = new ArrayList<String>();
    processes.add("miktex-pdftex --output-directory=[Directory] [file_name].tex");
    ProcessBuilder processbuild = new ProcessBuilder(processes);

1 个答案:

答案 0 :(得分:1)

首先,您需要确保您使用的命令实际上在命令中有效。如果没有,那么它将无法在Java中运行。

接下来,使用ProcessBuilder的主要原因之一是更好地处理命令/参数中的空格{.1}}。

Runtime#exec

所以上面很简单......

  • 我想要运行的命令是String command = "/Applications/MiKTeX Console.app/Contents/bin/miktex-pdftex"; String outputDir = System.getProperty("user.dir"); String sourceFile = "Sample.tex"; List<String> commands = new ArrayList<>(); commands.add(command); commands.add("--interaction=nonstopmode"); commands.add("--output-directory=" + outputDir); commands.add(sourceFile); (我在MacOS上运行,我无法在应用程序包之外安装命令)
  • 我希望/Applications/MiKTeX Console.app/Contents/bin/miktex-pdftex与当前工作目录(output-directory)相同,但您可以提供所需的一切
  • 我正在使用“nonstopmode”(System.getProperty("user.dir")),因为否则我会被要求提供输入,这只是更复杂
  • 我的输入文件(--interaction=nonstopmode)也在工作目录中。

接下来,我们构建Sample.tex并将错误流重定向到ProcessBuilder,这只是减少了下一个分别阅读这两个流...

InputStream

接下来,我们运行命令,读取ProcessBuilder pb = new ProcessBuilder(commands); pb.redirectErrorStream(true); 的内容(否则你可以拖延进程),你可以随心所欲地做到这一点,我只是将它回显到屏幕上

InputStream

这里使用try { Process process = pb.start(); InputStream is = process.getInputStream(); int in = -1; while ((in = is.read()) != -1) { System.out.print((char)in); } int exitValue = process.waitFor(); System.out.println(""); System.out.println("Did exit with " + exitValue); } catch (IOException | InterruptedException ex) { ex.printStackTrace(); } 只是为了确保命令已经完成并获得它生成的退出值。通常,int exitValue = process.waitFor();是成功的,但您需要阅读命令的文档以确保