Я уже создал 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 это успех, но вам нужно прочитать документацию команды, чтобы быть уверенным

Другие вопросы по тегам