Heere是我到目前为止的代码。我如何运行miktex-pdftex?
List<String> processes = new ArrayList<String>();
processes.add("miktex-pdftex --output-directory=[Directory] [file_name].tex");
ProcessBuilder processbuild = new ProcessBuilder(processes);
答案 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
)相同,但您可以提供所需的一切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();
是成功的,但您需要阅读命令的文档以确保