Я уже создал Process Builder. Как мне запустить все программы в Process Builder?
Вот код, который у меня есть. Как мне запустить miktex-pdftex?
List<String> processes = new ArrayList<String>();
processes.add("miktex-pdftex --output-directory=[Directory] [file_name].tex");
ProcessBuilder processbuild = new ProcessBuilder(processes);
1 ответ
Во-первых, вы должны убедиться, что команда, которую вы используете, действительно работает в команде. Если это не так, то это не будет работать в Java.
Далее одна из основных причин использования ProcessBuilder
лучше разбираться с пробелами в команде / параметрах 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);
Таким образом, вышесказанное очень просто...
- Команда, которую я хочу выполнить:
/Applications/MiKTeX Console.app/Contents/bin/miktex-pdftex
(Я работаю на MacOS и не могу установить команду за пределами пакета приложения) - Я хочу
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();
это просто для того, чтобы убедиться, что команда выполнена и получить сгенерированное ею значение выхода. Обычно, 0
это успех, но вам нужно прочитать документацию команды, чтобы быть уверенным