Как отключить всплывающее окно консоли и узнать, когда процесс, созданный ProcessBuilder, завершился, чтобы его можно было уничтожить

Я создаю Java-процесс, используя ProcessBuilder для ghostscript, чтобы преобразовать PDF в TIFF, как показано ниже.

process = new ProcessBuilder("D:\\ghost-script\\gs\\gs9.02\\bin\\gswin64.exe","-q",  "-dNOPAUSE", "-dBATCH", "-dMaxStripSize=8192", "-sDEVICE=tiffg4", "-r300x300", "-dDITHERPPI=200", "-sOutputFile=D:\\ghost-script\\example\\output.tif", "D:\\ghost-script\\example\\input2.pdf", "-c", "quit").start();

Теперь у меня две проблемы.

  1. Этот процесс открывает всплывающее окно консоли, которое мне не нужно, поскольку оно должно запускаться на сервере. Какой параметр я могу установить, чтобы отключить всплывающее окно консоли.
  2. Входной файл может быть любого размера. Как мне узнать, что процесс завершился, чтобы я мог его уничтожить. Мне не нужен Thread.sleep (time-to_sleep). Поскольку для другого размера входного файла он отличается, и если я возьму верхний предел, это сильно снизит производительность для файлов меньшего размера. Итак, что я могу сделать, чтобы уничтожить процесс, как только он будет завершен?

Любая помощь горячо приветствуется.


person Vishal Singh    schedule 26.02.2016    source источник
comment
Process#waitFor может быть хорошим началом для второго вопроса, но вы должны быть уверены, что читаете потоки вывода / ошибок процесса, чтобы убедиться, что он не останавливается / не блокируется. Что касается первого вопроса, я не уверен, что вы сможете, но вы можете использовать start или cmd для запуска свернутого окна   -  person MadProgrammer    schedule 26.02.2016
comment
Я тоже думал о том же Process # waitFor, но боялся, что процесс заблокируется. @MadProgrammer, не могли бы вы поделиться фрагментом кода для того же самого и немедленного восстановления после заблокированного процесса.   -  person Vishal Singh    schedule 26.02.2016
comment
Некоторым процессам не нравится, когда выходной поток заполняется, поэтому вам нужно его прочитать. Что касается того, чтобы знать, когда ваш отдельный процесс мог заблокироваться, несмотря на все ваши усилия, в противном случае это зависит от отдельного процесса, например, вы можете читать из InputStream процесса, и если вы ничего не читали в течение определенного периода времени, попробуй и destory процесс   -  person MadProgrammer    schedule 26.02.2016


Ответы (1)


Для вашего первого вопроса, окно исходит из исполняемого файла, который вы запускаете, вы можете использовать

gswin64c.exe

См. Этот раздел: Ghostscript подавляет окна вывода при вызове из командной строки < / а>

Для ответа на второй вопрос используйте waitFor ( ) на объекте Process.

process.waitFor();
person Arnaud    schedule 26.02.2016